]> granicus.if.org Git - php/commitdiff
Refactored the fix for bug #66084, by cmb@php.net
authorAnatol Belski <ab@php.net>
Fri, 29 May 2015 19:16:56 +0000 (21:16 +0200)
committerAnatol Belski <ab@php.net>
Fri, 29 May 2015 19:16:56 +0000 (21:16 +0200)
NEWS
ext/simplexml/simplexml.c
ext/simplexml/tests/bug61335.phpt [new file with mode: 0644]
ext/simplexml/tests/bug62639.phpt [new file with mode: 0644]
ext/simplexml/tests/bug67116.phpt [new file with mode: 0644]
ext/simplexml/tests/bug67572.phpt [new file with mode: 0644]
ext/simplexml/tests/bug69169.phpt [new file with mode: 0644]
ext/simplexml/tests/bug69491.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 7997ccfb85ff40caa5b7590e83f3a092fd6958e4..9e455df7c17498e9963694d9cd433c70c0782620 100644 (file)
--- a/NEWS
+++ b/NEWS
   . Fixed bug #69549 (Memory leak with opcache.optimization_level=0xFFFFFFFF).
     (Laruence, Dmitry)
 
+- SimpleXML:
+  . Refactored the fix for bug #66084 (simplexml_load_string() mangles empty
+    node name). (Christoph Michael Becker)
+
 14 May 2015, PHP 5.5.25
 
 - Core:
index e0de6ee7ef8280a12d77d76f1f971a944cbc8090..6b8e23a01a85046737ef7d31346da5164505c179 100644 (file)
@@ -1129,7 +1129,7 @@ static HashTable * sxe_get_prop_hash(zval *object, int is_debug TSRMLS_DC) /* {{
                        node = NULL;
                } else if (sxe->iter.type != SXE_ITER_CHILD) {
 
-                       if ( !node->children || !node->parent || !node->next || node->children->next || node->children->children || node->parent->children == node->parent->last ) {
+                       if ( sxe->iter.type == SXE_ITER_NONE || !node->children || !node->parent || node->children->next || node->children->children || node->parent->children == node->parent->last ) {
                                node = node->children;
                        } else {
                                iter_data = sxe->iter.data;
diff --git a/ext/simplexml/tests/bug61335.phpt b/ext/simplexml/tests/bug61335.phpt
new file mode 100644 (file)
index 0000000..d2b9477
--- /dev/null
@@ -0,0 +1,19 @@
+--TEST--
+Bug #61335 - Access to array node returns wrong truth value
+--SKIPIF--
+<?php
+if (!extension_loaded("simplexml")) die("skip SimpleXML not available");
+?>
+--FILE--
+<?php
+$rec1 = simplexml_load_string("<foo><bar>aa</bar>\n</foo>");
+$rec2 = simplexml_load_string("<foo><bar>aa</bar></foo>");
+
+if ($rec1->bar[0])      echo "NONEMPTY1\n";
+if ($rec1->bar[0] . "") echo "NONEMPTY2\n";
+if ($rec2->bar[0])      echo "NONEMPTY3\n";
+?>
+--EXPECT--
+NONEMPTY1
+NONEMPTY2
+NONEMPTY3
diff --git a/ext/simplexml/tests/bug62639.phpt b/ext/simplexml/tests/bug62639.phpt
new file mode 100644 (file)
index 0000000..4a4e157
--- /dev/null
@@ -0,0 +1,63 @@
+--TEST--
+Bug #62639 (XML structure broken)
+--SKIPIF--
+<?php
+if (!extension_loaded("simplexml")) die("skip SimpleXML not available");
+?>
+--FILE--
+<?php
+
+class A extends SimpleXMLElement
+{
+}
+
+$xml1 = <<<XML
+<?xml version="1.0"?>
+<a>
+    <b>
+        <c>
+            <value attr="Some Attr">Some Value</value>
+        </c>
+    </b>
+</a>
+XML;
+
+$a1 = new A($xml1);
+
+foreach ($a1->b->c->children() as $key => $value) {
+    var_dump($value);
+}
+
+$xml2 = <<<XML
+<?xml version="1.0"?>
+<a>
+    <b>
+        <c><value attr="Some Attr">Some Value</value></c>
+    </b>
+</a>
+XML;
+
+$a2 = new A($xml2);
+
+foreach ($a2->b->c->children() as $key => $value) {
+    var_dump($value);
+}?>
+--EXPECT--
+object(A)#2 (2) {
+  ["@attributes"]=>
+  array(1) {
+    ["attr"]=>
+    string(9) "Some Attr"
+  }
+  [0]=>
+  string(10) "Some Value"
+}
+object(A)#3 (2) {
+  ["@attributes"]=>
+  array(1) {
+    ["attr"]=>
+    string(9) "Some Attr"
+  }
+  [0]=>
+  string(10) "Some Value"
+}
\ No newline at end of file
diff --git a/ext/simplexml/tests/bug67116.phpt b/ext/simplexml/tests/bug67116.phpt
new file mode 100644 (file)
index 0000000..774e43c
--- /dev/null
@@ -0,0 +1,93 @@
+--TEST--
+Bug #67116 (Inconsistent parsing of Nodes w/o linefeed)
+--SKIPIF--
+<?php
+if (!extension_loaded("simplexml")) die("skip SimpleXML not available");
+?>
+--FILE--
+<?php
+
+$xml = <<<XML
+<?xml version="1.0" encoding="UTF-8"?>
+<aa>
+    <bs>
+        <b>b</b>
+    </bs>
+    <cs><c>b</c></cs>
+    <ds><d id="d"></d></ds>
+    <es>
+        <e id="e"></e>
+    </es>
+    <fs><f id="f"></f><f id="f"></f></fs>
+</aa>
+XML;
+$sxe = simplexml_load_string($xml);
+print_r($sxe);
+
+?>
+--EXPECT--
+SimpleXMLElement Object
+(
+    [bs] => SimpleXMLElement Object
+        (
+            [b] => b
+        )
+
+    [cs] => SimpleXMLElement Object
+        (
+            [c] => b
+        )
+
+    [ds] => SimpleXMLElement Object
+        (
+            [d] => SimpleXMLElement Object
+                (
+                    [@attributes] => Array
+                        (
+                            [id] => d
+                        )
+
+                )
+
+        )
+
+    [es] => SimpleXMLElement Object
+        (
+            [e] => SimpleXMLElement Object
+                (
+                    [@attributes] => Array
+                        (
+                            [id] => e
+                        )
+
+                )
+
+        )
+
+    [fs] => SimpleXMLElement Object
+        (
+            [f] => Array
+                (
+                    [0] => SimpleXMLElement Object
+                        (
+                            [@attributes] => Array
+                                (
+                                    [id] => f
+                                )
+
+                        )
+
+                    [1] => SimpleXMLElement Object
+                        (
+                            [@attributes] => Array
+                                (
+                                    [id] => f
+                                )
+
+                        )
+
+                )
+
+        )
+
+)
diff --git a/ext/simplexml/tests/bug67572.phpt b/ext/simplexml/tests/bug67572.phpt
new file mode 100644 (file)
index 0000000..4631f16
--- /dev/null
@@ -0,0 +1,33 @@
+--TEST--
+Bug #67572 - SimpleXMLElement not parsing \n correctly
+--SKIPIF--
+<?php
+if (!extension_loaded("simplexml")) die("skip SimpleXML not available");
+?>
+--FILE--
+<?php
+$foo = 'bar';
+print "regular string ... ";
+var_dump(empty($foo));
+
+$xml = simplexml_load_string("<xml><something>somevalue</something></xml>");
+$xml2 = simplexml_load_string("<xml>\n<something>somevalue</something>\n</xml>");
+
+foreach($xml as $key => $value) {
+    print "$key = $value ... ";
+    var_dump(empty($value));
+    var_dump($value == false);
+}
+
+foreach($xml2 as $key => $value) {
+    print "$key = $value ... ";
+    var_dump(empty($value));
+    var_dump($value == false);
+}
+?>
+--EXPECT--
+regular string ... bool(false)
+something = somevalue ... bool(false)
+bool(false)
+something = somevalue ... bool(false)
+bool(false)
diff --git a/ext/simplexml/tests/bug69169.phpt b/ext/simplexml/tests/bug69169.phpt
new file mode 100644 (file)
index 0000000..08cf299
--- /dev/null
@@ -0,0 +1,70 @@
+--TEST--
+Bug #69169 (simplexml_load_string parse wrongly when xml given in one row)
+--SKIPIF--
+<?php
+if (!extension_loaded("simplexml")) die("skip SimpleXML not available");
+?>
+--FILE--
+<?php
+$a = '<?xml version="1.0" encoding="UTF-8"?>
+<root a="b">
+       <row b="y">
+               <item s="t" />
+       </row>
+       <row p="c">
+               <item y="n" />
+       </row>
+</root>';
+$b = str_replace(array("\n", "\r", "\t"), "", $a);
+$simple_xml = simplexml_load_string($b);
+print_r($simple_xml);
+?>
+--EXPECT--
+SimpleXMLElement Object
+(
+    [@attributes] => Array
+        (
+            [a] => b
+        )
+
+    [row] => Array
+        (
+            [0] => SimpleXMLElement Object
+                (
+                    [@attributes] => Array
+                        (
+                            [b] => y
+                        )
+
+                    [item] => SimpleXMLElement Object
+                        (
+                            [@attributes] => Array
+                                (
+                                    [s] => t
+                                )
+
+                        )
+
+                )
+
+            [1] => SimpleXMLElement Object
+                (
+                    [@attributes] => Array
+                        (
+                            [p] => c
+                        )
+
+                    [item] => SimpleXMLElement Object
+                        (
+                            [@attributes] => Array
+                                (
+                                    [y] => n
+                                )
+
+                        )
+
+                )
+
+        )
+
+)
diff --git a/ext/simplexml/tests/bug69491.phpt b/ext/simplexml/tests/bug69491.phpt
new file mode 100644 (file)
index 0000000..b48a40b
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Bug #69491 (simplexml doesn't correctly parse empty nodes on same line as another node)
+--SKIPIF--
+<?php
+if (!extension_loaded("simplexml")) die("skip SimpleXML not available");
+?>
+--FILE--
+<?php
+var_dump(simplexml_load_string('<a>
+  <b><c/></b>
+</a>'));?>
+--EXPECT--
+object(SimpleXMLElement)#1 (1) {
+  ["b"]=>
+  object(SimpleXMLElement)#2 (1) {
+    ["c"]=>
+    object(SimpleXMLElement)#3 (0) {
+    }
+  }
+}