]> granicus.if.org Git - php/commitdiff
fix bug #48601 (xpath() returns FALSE for legitimate query)
authorRob Richards <rrichards@php.net>
Wed, 5 May 2010 11:40:11 +0000 (11:40 +0000)
committerRob Richards <rrichards@php.net>
Wed, 5 May 2010 11:40:11 +0000 (11:40 +0000)
add test

NEWS
ext/simplexml/simplexml.c
ext/simplexml/tests/bug48601.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 50c3f1d2ea44f629027f0ac1d11558e11d0f07d6..7108bd2959158d1291c626a8ad0c6ef64ca07627 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -137,6 +137,7 @@ PHP                                                                        NEWS
 - Fixed bug #48983 (DomDocument : saveHTMLFile wrong charset). (Rob)
 - Fixed bug #48902 (Timezone database fallback map is outdated). (Derick)
 - Fixed bug #48781 (Cyclical garbage collector memory leak). (Dmitry)
+- Fixed bug #48601 (xpath() returns FALSE for legitimate query). (Rob)
 - Fixed bug #48361 (SplFileInfo::getPathInfo should return the
   parent dir). (Etienne)
 - Fixed bug #48289 (iconv_mime_encode() quoted-printable scheme is broken).
index 3f41fc8357d4f60ad0c7ce7031e7d4080b0f0798..5087b4f9dc0421a1da7c644ef2f80b9ec1d76fc6 100644 (file)
@@ -1258,31 +1258,29 @@ SXE_METHOD(xpath)
        }
 
        result = retval->nodesetval;
-       if (!result) {
-               xmlXPathFreeObject(retval);
-               RETURN_FALSE;
-       }
 
        array_init(return_value);
 
-       for (i = 0; i < result->nodeNr; ++i) {
-               nodeptr = result->nodeTab[i];
-               if (nodeptr->type == XML_TEXT_NODE || nodeptr->type == XML_ELEMENT_NODE || nodeptr->type == XML_ATTRIBUTE_NODE) {
-                       MAKE_STD_ZVAL(value);
-                       /**
-                        * Detect the case where the last selector is text(), simplexml
-                        * always accesses the text() child by default, therefore we assign
-                        * to the parent node.
-                        */
-                       if (nodeptr->type == XML_TEXT_NODE) {
-                               _node_as_zval(sxe, nodeptr->parent, value, SXE_ITER_NONE, NULL, NULL, 0 TSRMLS_CC);
-                       } else if (nodeptr->type == XML_ATTRIBUTE_NODE) {
-                               _node_as_zval(sxe, nodeptr->parent, value, SXE_ITER_ATTRLIST, (char*)nodeptr->name, nodeptr->ns ? (xmlChar *)nodeptr->ns->href : NULL, 0 TSRMLS_CC);
-                       } else {
-                               _node_as_zval(sxe, nodeptr, value, SXE_ITER_NONE, NULL, NULL, 0 TSRMLS_CC);
-                       }
+       if (result != NULL) {
+               for (i = 0; i < result->nodeNr; ++i) {
+                       nodeptr = result->nodeTab[i];
+                       if (nodeptr->type == XML_TEXT_NODE || nodeptr->type == XML_ELEMENT_NODE || nodeptr->type == XML_ATTRIBUTE_NODE) {
+                               MAKE_STD_ZVAL(value);
+                               /**
+                                * Detect the case where the last selector is text(), simplexml
+                                * always accesses the text() child by default, therefore we assign
+                                * to the parent node.
+                                */
+                               if (nodeptr->type == XML_TEXT_NODE) {
+                                       _node_as_zval(sxe, nodeptr->parent, value, SXE_ITER_NONE, NULL, NULL, 0 TSRMLS_CC);
+                               } else if (nodeptr->type == XML_ATTRIBUTE_NODE) {
+                                       _node_as_zval(sxe, nodeptr->parent, value, SXE_ITER_ATTRLIST, (char*)nodeptr->name, nodeptr->ns ? (xmlChar *)nodeptr->ns->href : NULL, 0 TSRMLS_CC);
+                               } else {
+                                       _node_as_zval(sxe, nodeptr, value, SXE_ITER_NONE, NULL, NULL, 0 TSRMLS_CC);
+                               }
 
-                       add_next_index_zval(return_value, value);
+                               add_next_index_zval(return_value, value);
+                       }
                }
        }
 
diff --git a/ext/simplexml/tests/bug48601.phpt b/ext/simplexml/tests/bug48601.phpt
new file mode 100644 (file)
index 0000000..24bf2bf
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Bug #48601 (xpath() returns FALSE for legitimate query)
+--SKIPIF--
+<?php if (!extension_loaded("simplexml")) print "skip"; ?>
+--FILE--
+<?php
+
+$sxe = simplexml_load_string('<root><node1>1</node1></root>');
+
+$nodes = $sxe->xpath("/root/node2/@test");
+
+if (! is_array($nodes)) {
+    echo "An error occured\n";
+} else {
+   echo "Result Count: " . count($nodes) . "\n";
+}
+
+?>
+--EXPECTF--
+Result Count: 0