]> granicus.if.org Git - php/commitdiff
Fix bug #72957
authorNikita Popov <nikic@php.net>
Tue, 30 Aug 2016 11:05:53 +0000 (13:05 +0200)
committerNikita Popov <nikic@php.net>
Tue, 30 Aug 2016 11:05:53 +0000 (13:05 +0200)
NEWS
ext/simplexml/simplexml.c
ext/simplexml/tests/bug72957.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 5e7c69085e9b6d50d648356942751b29e0cb2d88..4c21c43677b3b665f95b769944ed8a09029854dc 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -78,6 +78,8 @@ PHP                                                                        NEWS
 
 - SimpleXML:
   . Fixed bug #72971 (SimpleXML isset/unset do not respect namespace). (Nikita)
+  . Fixed bug #72957 (Null coalescing operator doesn't behave as expected with
+    SimpleXMLElement). (Nikita)
 
 - Standard:
   . Fixed bug #55451 (substr_compare NULL length interpreted as 0). (Lauri
index 1f70ddd684c8dfc607fb7c0465c64feddced5fa3..a20cb3e22a257fdd169b0402d9aa6be4c6e558df 100644 (file)
@@ -356,7 +356,10 @@ long_dim:
                                        _node_as_zval(sxe, node, rv, newtype, name, sxe->iter.nsprefix, sxe->iter.isprefix);
                                }
 #else
-                               _node_as_zval(sxe, node, rv, SXE_ITER_ELEMENT, name, sxe->iter.nsprefix, sxe->iter.isprefix);
+                               /* In BP_VAR_IS mode only return a proper node if it actually exists. */
+                               if (type != BP_VAR_IS || sxe_find_element_by_name(sxe, node->children, (xmlChar *) name)) {
+                                       _node_as_zval(sxe, node, rv, SXE_ITER_ELEMENT, name, sxe->iter.nsprefix, sxe->iter.isprefix);
+                               }
 #endif
                        }
                }
@@ -801,17 +804,8 @@ static int sxe_prop_dim_exists(zval *object, zval *member, int check_empty, zend
                                        node = php_sxe_get_first_node(sxe, node);
                                }
                                node = sxe_get_element_by_offset(sxe, Z_LVAL_P(member), node, NULL);
-                       }
-                       else {
-                               node = node->children;
-                               while (node) {
-                                       xmlNodePtr nnext;
-                                       nnext = node->next;
-                                       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;
-                               }
+                       } else {
+                               node = sxe_find_element_by_name(sxe, node->children, (xmlChar *)Z_STRVAL_P(member));
                        }
                        if (node) {
                                exists = 1;
diff --git a/ext/simplexml/tests/bug72957.phpt b/ext/simplexml/tests/bug72957.phpt
new file mode 100644 (file)
index 0000000..29ca69f
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+Bug #72957: Null coalescing operator doesn't behave as expected with SimpleXMLElement
+--SKIPIF--
+<?php if (!extension_loaded("simplexml")) print "skip simplexml extension is not loaded"; ?>
+--FILE--
+<?php
+
+$xml = new SimpleXMLElement('<root><elem>Text</elem></root>');
+
+echo 'elem2 is: ' . ($xml->elem2 ?? 'backup string') . "\n";
+echo 'elem2 is: ' . (isset($xml->elem2) ? $xml->elem2 : 'backup string') . "\n";
+
+?>
+--EXPECT--
+elem2 is: backup string
+elem2 is: backup string