Skip to content

Commit d079a1c

Browse files
committed
better approach to fix bug #69846
don't destroy the current iterator object too early
1 parent bb4454b commit d079a1c

File tree

2 files changed

+7
-4
lines changed

2 files changed

+7
-4
lines changed

ext/dom/dom_iterators.c

+6-2
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,6 @@ static void php_dom_iterator_move_forward(zend_object_iterator *iter) /* {{{ */
190190
objmap = (dom_nnodemap_object *)nnmap->ptr;
191191

192192
intern = Z_DOMOBJ_P(&iterator->curobj);
193-
zval_ptr_dtor(&iterator->curobj);
194-
ZVAL_UNDEF(&iterator->curobj);
195193

196194
if (intern != NULL && intern->ptr != NULL) {
197195
if (objmap->nodetype != XML_ENTITY_NODE &&
@@ -200,6 +198,8 @@ static void php_dom_iterator_move_forward(zend_object_iterator *iter) /* {{{ */
200198
nodeht = HASH_OF(&objmap->baseobj_zv);
201199
zend_hash_move_forward(nodeht);
202200
if ((entry = zend_hash_get_current_data(nodeht))) {
201+
zval_ptr_dtor(&iterator->curobj);
202+
ZVAL_UNDEF(&iterator->curobj);
203203
ZVAL_COPY(&iterator->curobj, entry);
204204
}
205205
} else {
@@ -231,6 +231,10 @@ static void php_dom_iterator_move_forward(zend_object_iterator *iter) /* {{{ */
231231
}
232232
}
233233
err:
234+
if (IS_UNDEF != Z_TYPE(iterator->curobj)) {
235+
zval_ptr_dtor(&iterator->curobj);
236+
ZVAL_UNDEF(&iterator->curobj);
237+
}
234238
if (curnode) {
235239
php_dom_create_object(curnode, &iterator->curobj, objmap->baseobj);
236240
}

ext/dom/php_dom.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,7 @@ int dom_nodelist_has_dimension(zval *object, zval *member, int check_empty);
132132
#define REGISTER_DOM_CLASS(ce, name, parent_ce, funcs, entry) \
133133
INIT_CLASS_ENTRY(ce, name, funcs); \
134134
ce.create_object = dom_objects_new; \
135-
entry = zend_register_internal_class_ex(&ce, parent_ce); \
136-
entry->ce_flags |= ZEND_ACC_USE_GUARDS;
135+
entry = zend_register_internal_class_ex(&ce, parent_ce);
137136

138137
#define DOM_GET_OBJ(__ptr, __id, __prtype, __intern) { \
139138
__intern = Z_DOMOBJ_P(__id); \

0 commit comments

Comments
 (0)