]> granicus.if.org Git - php/commitdiff
Better fix for bug #75451 (Assertion fails while foreach on empty xpath query)
authorDmitry Stogov <dmitry@zend.com>
Mon, 30 Oct 2017 09:04:15 +0000 (12:04 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 30 Oct 2017 09:04:15 +0000 (12:04 +0300)
ext/dom/dom_iterators.c
ext/dom/php_dom.h
ext/dom/xpath.c

index 02f1e3c4720b06823d6f95efb6a2c77c810f450f..27bd960c4a9426f1d157b611029d678a7ae2dae2 100644 (file)
@@ -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 {
index 30d143c3513b9ec021ac92a4f95a1913a355e41e..8bcbcd830625d74e34395638d3e8383ca5335a87 100644 (file)
@@ -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"
index 31e4dc98b4ffac8fabcafb7428a146b3a8a4ea72..f0b908ccf3fdc5fc4351166990e128bf3a9e4540 100644 (file)
@@ -432,8 +432,9 @@ static void php_xpath_eval(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */
                        int i;
                        xmlNodeSetPtr nodesetp;
 
-                       array_init(&retval);
                        if (xpathobjp->type == XPATH_NODESET && NULL != (nodesetp = xpathobjp->nodesetval) && nodesetp->nodeNr) {
+
+                               array_init(&retval);
                                for (i = 0; i < nodesetp->nodeNr; i++) {
                                        xmlNodePtr node = nodesetp->nodeTab[i];
                                        zval child;
@@ -459,6 +460,8 @@ static void php_xpath_eval(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */
                                        php_dom_create_object(node, &child, &intern->dom);
                                        add_next_index_zval(&retval, &child);
                                }
+                       } else {
+                               ZVAL_EMPTY_ARRAY(&retval);
                        }
                        php_dom_create_interator(return_value, DOM_NODELIST);
                        nodeobj = Z_DOMOBJ_P(return_value);