summaryrefslogtreecommitdiff
path: root/ext/dom
diff options
context:
space:
mode:
Diffstat (limited to 'ext/dom')
-rw-r--r--ext/dom/dom_iterators.c8
-rw-r--r--ext/dom/php_dom.h1
-rw-r--r--ext/dom/tests/bug75451.phpt18
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