From 5683b6fa3962f483a407ca17d49397b203ed4145 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 29 May 2015 21:16:56 +0200 Subject: [PATCH] Refactored the fix for bug #66084, by cmb@php.net --- NEWS | 4 ++ ext/simplexml/simplexml.c | 2 +- ext/simplexml/tests/bug61335.phpt | 19 +++++++ ext/simplexml/tests/bug62639.phpt | 63 +++++++++++++++++++++ ext/simplexml/tests/bug67116.phpt | 93 +++++++++++++++++++++++++++++++ ext/simplexml/tests/bug67572.phpt | 33 +++++++++++ ext/simplexml/tests/bug69169.phpt | 70 +++++++++++++++++++++++ ext/simplexml/tests/bug69491.phpt | 20 +++++++ 8 files changed, 303 insertions(+), 1 deletion(-) create mode 100644 ext/simplexml/tests/bug61335.phpt create mode 100644 ext/simplexml/tests/bug62639.phpt create mode 100644 ext/simplexml/tests/bug67116.phpt create mode 100644 ext/simplexml/tests/bug67572.phpt create mode 100644 ext/simplexml/tests/bug69169.phpt create mode 100644 ext/simplexml/tests/bug69491.phpt diff --git a/NEWS b/NEWS index 7997ccfb85..9e455df7c1 100644 --- a/NEWS +++ b/NEWS @@ -35,6 +35,10 @@ . 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: diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index e0de6ee7ef..6b8e23a01a 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -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 index 0000000000..d2b9477ceb --- /dev/null +++ b/ext/simplexml/tests/bug61335.phpt @@ -0,0 +1,19 @@ +--TEST-- +Bug #61335 - Access to array node returns wrong truth value +--SKIPIF-- + +--FILE-- +aa\n"); +$rec2 = simplexml_load_string("aa"); + +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 index 0000000000..4a4e157b76 --- /dev/null +++ b/ext/simplexml/tests/bug62639.phpt @@ -0,0 +1,63 @@ +--TEST-- +Bug #62639 (XML structure broken) +--SKIPIF-- + +--FILE-- + + + + + Some Value + + + +XML; + +$a1 = new A($xml1); + +foreach ($a1->b->c->children() as $key => $value) { + var_dump($value); +} + +$xml2 = << + + + Some Value + + +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 index 0000000000..774e43c99b --- /dev/null +++ b/ext/simplexml/tests/bug67116.phpt @@ -0,0 +1,93 @@ +--TEST-- +Bug #67116 (Inconsistent parsing of Nodes w/o linefeed) +--SKIPIF-- + +--FILE-- + + + + b + + b + + + + + + +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 index 0000000000..4631f16142 --- /dev/null +++ b/ext/simplexml/tests/bug67572.phpt @@ -0,0 +1,33 @@ +--TEST-- +Bug #67572 - SimpleXMLElement not parsing \n correctly +--SKIPIF-- + +--FILE-- +somevalue"); +$xml2 = simplexml_load_string("\nsomevalue\n"); + +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 index 0000000000..08cf299290 --- /dev/null +++ b/ext/simplexml/tests/bug69169.phpt @@ -0,0 +1,70 @@ +--TEST-- +Bug #69169 (simplexml_load_string parse wrongly when xml given in one row) +--SKIPIF-- + +--FILE-- + + + + + + + + +'; +$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 index 0000000000..b48a40bf95 --- /dev/null +++ b/ext/simplexml/tests/bug69491.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug #69491 (simplexml doesn't correctly parse empty nodes on same line as another node) +--SKIPIF-- + +--FILE-- + + +'));?> +--EXPECT-- +object(SimpleXMLElement)#1 (1) { + ["b"]=> + object(SimpleXMLElement)#2 (1) { + ["c"]=> + object(SimpleXMLElement)#3 (0) { + } + } +} -- 2.40.0