Skip to content

Commit 39a9e56

Browse files
committed
Fix GH-12223: Entity reference produces infinite loop in var_dump/print_r
Closes GH-12223.
1 parent 4d888cf commit 39a9e56

File tree

3 files changed

+75
-0
lines changed

3 files changed

+75
-0
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ PHP NEWS
1313
. Fixed bug GH-12170 (Can't use xpath with comments in SimpleXML). (nielsdos)
1414
. Fixed bug GH-12192 (SimpleXML infinite loop when getName() is called
1515
within foreach). (nielsdos)
16+
. Fixed bug GH-12223 (Entity reference produces infinite loop in
17+
var_dump/print_r). (nielsdos)
1618

1719
28 Sep 2023, PHP 8.1.24
1820

ext/simplexml/simplexml.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,6 +1197,12 @@ static HashTable *sxe_get_prop_hash(zend_object *object, int is_debug) /* {{{ */
11971197
sxe_properties_add(rv, name, namelen, &value);
11981198
}
11991199
next_iter:
1200+
if (UNEXPECTED(node->type == XML_ENTITY_DECL)) {
1201+
/* Entity decls are linked together via the next pointer.
1202+
* The only way to get to an entity decl is via an entity reference in the document.
1203+
* If we then continue iterating, we'll end up in the DTD. Even worse, if the entities reference each other we'll infinite loop. */
1204+
break;
1205+
}
12001206
if (use_iter) {
12011207
node = php_sxe_iterator_fetch(sxe, node->next, 0);
12021208
} else {

ext/simplexml/tests/gh12223.phpt

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
--TEST--
2+
GH-12223: Entity reference produces infinite loop in var_dump/print_r
3+
--EXTENSIONS--
4+
simplexml
5+
--FILE--
6+
<?php
7+
8+
$xml = <<<XML
9+
<?xml version="1.0"?>
10+
<!DOCTYPE somedoc [
11+
<!ENTITY a "something">
12+
<!ENTITY b "&a;">
13+
<!ENTITY c "&b;">
14+
]>
15+
<somedoc>&c;</somedoc>
16+
XML;
17+
18+
$sxe = simplexml_load_string($xml);
19+
20+
var_dump($sxe);
21+
print_r($sxe);
22+
23+
?>
24+
--EXPECT--
25+
object(SimpleXMLElement)#1 (1) {
26+
["c"]=>
27+
object(SimpleXMLElement)#2 (1) {
28+
["c"]=>
29+
object(SimpleXMLElement)#3 (1) {
30+
["b"]=>
31+
object(SimpleXMLElement)#4 (1) {
32+
["b"]=>
33+
object(SimpleXMLElement)#5 (1) {
34+
["a"]=>
35+
object(SimpleXMLElement)#6 (1) {
36+
["a"]=>
37+
string(9) "something"
38+
}
39+
}
40+
}
41+
}
42+
}
43+
}
44+
SimpleXMLElement Object
45+
(
46+
[c] => SimpleXMLElement Object
47+
(
48+
[c] => SimpleXMLElement Object
49+
(
50+
[b] => SimpleXMLElement Object
51+
(
52+
[b] => SimpleXMLElement Object
53+
(
54+
[a] => SimpleXMLElement Object
55+
(
56+
[a] => something
57+
)
58+
59+
)
60+
61+
)
62+
63+
)
64+
65+
)
66+
67+
)

0 commit comments

Comments
 (0)