diff options
Diffstat (limited to 'ext/dom')
-rw-r--r-- | ext/dom/dom_iterators.c | 8 | ||||
-rw-r--r-- | ext/dom/php_dom.h | 1 | ||||
-rw-r--r-- | ext/dom/tests/bug75451.phpt | 18 |
3 files changed, 23 insertions, 4 deletions
diff --git a/ext/dom/dom_iterators.c b/ext/dom/dom_iterators.c index 02f1e3c472..27bd960c4a 100644 --- a/ext/dom/dom_iterators.c +++ b/ext/dom/dom_iterators.c @@ -197,8 +197,8 @@ static void php_dom_iterator_move_forward(zend_object_iterator *iter) /* {{{ */ objmap->nodetype != XML_NOTATION_NODE) { if (objmap->nodetype == DOM_NODESET) { nodeht = HASH_OF(&objmap->baseobj_zv); - zend_hash_move_forward(nodeht); - if ((entry = zend_hash_get_current_data(nodeht))) { + zend_hash_move_forward_ex(nodeht, &iterator->pos); + if ((entry = zend_hash_get_current_data_ex(nodeht, &iterator->pos))) { zval_ptr_dtor(&iterator->curobj); ZVAL_UNDEF(&iterator->curobj); ZVAL_COPY(&iterator->curobj, entry); @@ -281,8 +281,8 @@ zend_object_iterator *php_dom_get_iterator(zend_class_entry *ce, zval *object, i objmap->nodetype != XML_NOTATION_NODE) { if (objmap->nodetype == DOM_NODESET) { nodeht = HASH_OF(&objmap->baseobj_zv); - zend_hash_internal_pointer_reset(nodeht); - if ((entry = zend_hash_get_current_data(nodeht))) { + zend_hash_internal_pointer_reset_ex(nodeht, &iterator->pos); + if ((entry = zend_hash_get_current_data_ex(nodeht, &iterator->pos))) { ZVAL_COPY(&iterator->curobj, entry); } } else { diff --git a/ext/dom/php_dom.h b/ext/dom/php_dom.h index 30d143c351..8bcbcd8306 100644 --- a/ext/dom/php_dom.h +++ b/ext/dom/php_dom.h @@ -93,6 +93,7 @@ typedef struct _dom_nnodemap_object { typedef struct { zend_object_iterator intern; zval curobj; + HashPosition pos; } php_dom_iterator; #include "dom_fe.h" diff --git a/ext/dom/tests/bug75451.phpt b/ext/dom/tests/bug75451.phpt new file mode 100644 index 0000000000..dae7cde98b --- /dev/null +++ b/ext/dom/tests/bug75451.phpt @@ -0,0 +1,18 @@ +--TEST-- +Bug #75451 (Assertion fails while foreach on empty xpath query) +--SKIPIF-- +<?php +require_once('skipif.inc'); +?> +--FILE-- +<?php +$dom = new DOMDocument(); +$dom->loadXML('<root><child/></root>'); +$xpath = new DOMXpath($dom); +foreach($xpath->query('/root/noexist') as $child) { + var_dump($child); +} +?> +okey +--EXPECT-- +okey |