]> granicus.if.org Git - php/commitdiff
better approach to fix bug #69846
authorAnatol Belski <ab@php.net>
Fri, 19 Jun 2015 09:22:12 +0000 (11:22 +0200)
committerAnatol Belski <ab@php.net>
Fri, 19 Jun 2015 09:22:12 +0000 (11:22 +0200)
don't destroy the current iterator object too early

ext/dom/dom_iterators.c
ext/dom/php_dom.h

index e72bd090ac734dc8b3179d85d97790e548d84871..7cef63bf9a9c78f8587420bdb303faf0195ad619 100644 (file)
@@ -190,8 +190,6 @@ static void php_dom_iterator_move_forward(zend_object_iterator *iter) /* {{{ */
        objmap = (dom_nnodemap_object *)nnmap->ptr;
 
        intern = Z_DOMOBJ_P(&iterator->curobj);
-       zval_ptr_dtor(&iterator->curobj);
-       ZVAL_UNDEF(&iterator->curobj);
 
        if (intern != NULL && intern->ptr != NULL) {
                if (objmap->nodetype != XML_ENTITY_NODE &&
@@ -200,6 +198,8 @@ static void php_dom_iterator_move_forward(zend_object_iterator *iter) /* {{{ */
                                nodeht = HASH_OF(&objmap->baseobj_zv);
                                zend_hash_move_forward(nodeht);
                                if ((entry = zend_hash_get_current_data(nodeht))) {
+                                       zval_ptr_dtor(&iterator->curobj);
+                                       ZVAL_UNDEF(&iterator->curobj);
                                        ZVAL_COPY(&iterator->curobj, entry);
                                }
                        } else {
@@ -231,6 +231,10 @@ static void php_dom_iterator_move_forward(zend_object_iterator *iter) /* {{{ */
                }
        }
 err:
+       if (IS_UNDEF != Z_TYPE(iterator->curobj)) {
+               zval_ptr_dtor(&iterator->curobj);
+               ZVAL_UNDEF(&iterator->curobj);
+       }
        if (curnode) {
                php_dom_create_object(curnode, &iterator->curobj, objmap->baseobj);
        }
index 500990e5d1d3a8306ff984cbca951a129e09c53b..65534b19d49e6e3f5ee179c564202c722738bee6 100644 (file)
@@ -132,8 +132,7 @@ int dom_nodelist_has_dimension(zval *object, zval *member, int check_empty);
 #define REGISTER_DOM_CLASS(ce, name, parent_ce, funcs, entry) \
 INIT_CLASS_ENTRY(ce, name, funcs); \
 ce.create_object = dom_objects_new; \
-entry = zend_register_internal_class_ex(&ce, parent_ce); \
-entry->ce_flags |= ZEND_ACC_USE_GUARDS;
+entry = zend_register_internal_class_ex(&ce, parent_ce);
 
 #define DOM_GET_OBJ(__ptr, __id, __prtype, __intern) { \
        __intern = Z_DOMOBJ_P(__id); \