diff --git a/NEWS b/NEWS index 378643836c80..95643bbd7279 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.4.25 +- SimpleXML: + . Fixed bug GH-12171 (SimpleXML property-proxy equality ignores element + names). (iliaal) + - Date: . Fixed leak on double DatePeriod::__construct() call. (ilutov) diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 8cf8e657e58f..c9a3f6ff8869 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -1220,8 +1220,11 @@ static int sxe_objects_compare(zval *object1, zval *object2) /* {{{ */ sxe2 = Z_SXEOBJ_P(object2); if (sxe1->node != NULL && sxe2->node != NULL) { + xmlNodePtr node1 = php_sxe_get_first_node_non_destructive(sxe1, sxe1->node->node); + xmlNodePtr node2 = php_sxe_get_first_node_non_destructive(sxe2, sxe2->node->node); + /* Both nodes set: Only support equality comparison between nodes. */ - if (sxe1->node == sxe2->node) { + if (node1 && node1 == node2) { return 0; } return ZEND_UNCOMPARABLE; diff --git a/ext/simplexml/tests/gh12171.phpt b/ext/simplexml/tests/gh12171.phpt new file mode 100644 index 000000000000..2d6b38e76673 --- /dev/null +++ b/ext/simplexml/tests/gh12171.phpt @@ -0,0 +1,23 @@ +--TEST-- +GH-12171 (SimpleXML property-proxy equality must resolve iterator nodes) +--EXTENSIONS-- +simplexml +--FILE-- +'); +echo "first==second: "; +var_dump($xml->first == $xml->second); +echo "first==first: "; +var_dump($xml->first == $xml->first); +echo "first==root: "; +var_dump($xml->first == $xml); +$a = $xml->first; +$b = $xml->first; +echo "proxies equal: "; +var_dump($a == $b); +?> +--EXPECT-- +first==second: bool(false) +first==first: bool(true) +first==root: bool(false) +proxies equal: bool(true)