]> 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

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

index b07187819064cd9ff4ae926ff17009eaf34d85a8..b7d042f222ef7c7fd159b3194f610707fc62b988 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