[php-src] master: Merge branch 'PHP-8.4' into PHP-8.5
David Carlier <[email protected]> Wed, 22 Jul 2026 05:51:02 +0000
| Newsgroups | gmane.comp.php.cvs.general |
|---|---|
| Message-ID | <[email protected]> |
Author: David Carlier (devnexen)
Date: 2026-07-22T06:50:39+01:00
Commit: https://github.com/php/php-src/commit/6e7491400ac0508780faad18578d96eb5372225e
Raw diff: https://github.com/php/php-src/commit/6e7491400ac0508780faad18578d96eb5372225e.diff
Merge branch 'PHP-8.4' into PHP-8.5
* PHP-8.4:
ext/dom: fix UAF when setting an attribute colliding by local name.
Changed paths:
A ext/dom/tests/gh22447.phpt
M ext/dom/element.c
M ext/dom/node.c
Diff:
diff --git a/ext/dom/element.c b/ext/dom/element.c
index a1301e106291..493e8a35410f 100644
--- a/ext/dom/element.c
+++ b/ext/dom/element.c
@@ -722,6 +722,8 @@ static void dom_element_set_attribute_node_common(INTERNAL_FUNCTION_PARAMETERS,
nsp = attrp->ns;
if (use_ns && nsp != NULL) {
existattrp = xmlHasNsProp(nodep, attrp->name, nsp->href);
+ } else if (nsp == NULL) {
+ existattrp = xmlHasNsProp(nodep, attrp->name, NULL);
} else {
existattrp = xmlHasProp(nodep, attrp->name);
}
diff --git a/ext/dom/node.c b/ext/dom/node.c
index 44eaf9d55ccb..04e03c1b0120 100644
--- a/ext/dom/node.c
+++ b/ext/dom/node.c
@@ -965,7 +965,7 @@ static void dom_node_insert_before_legacy(zval *return_value, zval *ref, dom_obj
xmlAttrPtr lastattr;
if (child->ns == NULL)
- lastattr = xmlHasProp(refp->parent, child->name);
+ lastattr = xmlHasNsProp(refp->parent, child->name, NULL);
else
lastattr = xmlHasNsProp(refp->parent, child->name, child->ns->href);
if (lastattr != NULL && lastattr->type != XML_ATTRIBUTE_DECL) {
@@ -1012,7 +1012,7 @@ static void dom_node_insert_before_legacy(zval *return_value, zval *ref, dom_obj
xmlAttrPtr lastattr;
if (child->ns == NULL)
- lastattr = xmlHasProp(parentp, child->name);
+ lastattr = xmlHasNsProp(parentp, child->name, NULL);
else
lastattr = xmlHasNsProp(parentp, child->name, child->ns->href);
if (lastattr != NULL && lastattr->type != XML_ATTRIBUTE_DECL) {
@@ -1374,7 +1374,7 @@ static void dom_node_append_child_legacy(zval *return_value, dom_object *intern,
xmlAttrPtr lastattr;
if (child->ns == NULL)
- lastattr = xmlHasProp(nodep, child->name);
+ lastattr = xmlHasNsProp(nodep, child->name, NULL);
else
lastattr = xmlHasNsProp(nodep, child->name, child->ns->href);
if (lastattr != NULL && lastattr->type != XML_ATTRIBUTE_DECL) {
diff --git a/ext/dom/tests/gh22447.phpt b/ext/dom/tests/gh22447.phpt
new file mode 100644
index 000000000000..396a0ff1ee1c
--- /dev/null
+++ b/ext/dom/tests/gh22447.phpt
@@ -0,0 +1,25 @@
+--TEST--
+GH-22447 (UAF at dom_objects_free_storage when setAttributeNode collides with a namespaced attribute of the same local name)
+--EXTENSIONS--
+dom
+--FILE--
+<?php
+$dom = Dom\HTMLDocument::createEmpty();
+
+$attribute1 = $dom->createAttribute("my-attribute");
+$container = $dom->appendChild($dom->createElement("container"));
+$attribute2 = $dom->createAttribute("my-attribute");
+$attribute4 = $dom->createAttributeNS("urn:a", "my-attribute");
+
+$container->setAttributeNode($attribute1);
+$container->setAttributeNode($attribute4);
+
+var_dump($container->setAttributeNode($attribute2) === $attribute1);
+var_dump($container->setAttributeNode($attribute1) === $attribute2);
+
+echo $dom->saveXml($container), PHP_EOL;
+?>
+--EXPECT--
+bool(true)
+bool(true)
+<container xmlns="http://www.w3.org/1999/xhtml" xmlns:ns1="urn:a" ns1:my-attribute="" my-attribute=""></container>