]> granicus.if.org Git - php/commitdiff
Fix bug #72971
authorNikita Popov <nikic@php.net>
Tue, 30 Aug 2016 08:54:31 +0000 (10:54 +0200)
committerNikita Popov <nikic@php.net>
Tue, 30 Aug 2016 08:54:31 +0000 (10:54 +0200)
NEWS
ext/simplexml/simplexml.c
ext/simplexml/tests/bug72971.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 3bc47ecd4d38dfb5cf4a9aacf4b14c699ad06cb7..5e7c69085e9b6d50d648356942751b29e0cb2d88 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -76,6 +76,9 @@ PHP                                                                        NEWS
   . Fixed bug #72940 (SID always return "name=ID", even if session
     cookie exist). (Yasuo)
 
+- SimpleXML:
+  . Fixed bug #72971 (SimpleXML isset/unset do not respect namespace). (Nikita)
+
 - Standard:
   . Fixed bug #55451 (substr_compare NULL length interpreted as 0). (Lauri
     Kenttä)
index 3b27656786ea29ce872a5d3c850e387528e13eb5..7c1e68787cf5fe2556798a47ff4be2bc08e4c971 100644 (file)
@@ -807,7 +807,7 @@ static int sxe_prop_dim_exists(zval *object, zval *member, int check_empty, zend
                                while (node) {
                                        xmlNodePtr nnext;
                                        nnext = node->next;
-                                       if ((node->type == XML_ELEMENT_NODE) && !xmlStrcmp(node->name, (xmlChar *)Z_STRVAL_P(member))) {
+                                       if (node->type == XML_ELEMENT_NODE && !xmlStrcmp(node->name, (xmlChar *)Z_STRVAL_P(member)) && match_ns(sxe, node, sxe->iter.nsprefix, sxe->iter.isprefix)) {
                                                break;
                                        }
                                        node = nnext;
@@ -937,7 +937,7 @@ static void sxe_prop_dim_delete(zval *object, zval *member, zend_bool elements,
 
                                        SKIP_TEXT(node);
 
-                                       if (!xmlStrcmp(node->name, (xmlChar *)Z_STRVAL_P(member))) {
+                                       if (!xmlStrcmp(node->name, (xmlChar *)Z_STRVAL_P(member)) && match_ns(sxe, node, sxe->iter.nsprefix, sxe->iter.isprefix)) {
                                                xmlUnlinkNode(node);
                                                php_libxml_node_free_resource(node);
                                        }
diff --git a/ext/simplexml/tests/bug72971.phpt b/ext/simplexml/tests/bug72971.phpt
new file mode 100644 (file)
index 0000000..ff7ded0
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+Bug #72971: SimpleXML isset/unset do not respect namespace
+--SKIPIF--
+<?php if (!extension_loaded("simplexml")) print "skip simplexml extension is not loaded"; ?>
+--FILE--
+<?php
+
+$xml = new SimpleXMLElement('<root xmlns:ns="ns"><foo>bar</foo><ns:foo>ns:bar</ns:foo><ns:foo2>ns:bar2</ns:foo2></root>');
+var_dump(isset($xml->foo2));
+unset($xml->foo);
+var_dump($xml->children('ns'));
+
+?>
+--EXPECT--
+bool(false)
+object(SimpleXMLElement)#2 (2) {
+  ["foo"]=>
+  string(6) "ns:bar"
+  ["foo2"]=>
+  string(7) "ns:bar2"
+}