From d079a1c9ea16ff2c5f40f82bd558355f78f103cf Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 19 Jun 2015 11:22:12 +0200 Subject: [PATCH] better approach to fix bug #69846 don't destroy the current iterator object too early --- ext/dom/dom_iterators.c | 8 ++++++-- ext/dom/php_dom.h | 3 +-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ext/dom/dom_iterators.c b/ext/dom/dom_iterators.c index e72bd090ac..7cef63bf9a 100644 --- a/ext/dom/dom_iterators.c +++ b/ext/dom/dom_iterators.c @@ -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); } diff --git a/ext/dom/php_dom.h b/ext/dom/php_dom.h index 500990e5d1..65534b19d4 100644 --- a/ext/dom/php_dom.h +++ b/ext/dom/php_dom.h @@ -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); \ -- 2.40.0