summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Richards <rrichards@php.net>2008-06-14 11:22:57 +0000
committerRob Richards <rrichards@php.net>2008-06-14 11:22:57 +0000
commit790f5ee062c3ce6f986916f30ffb1bf77dc1183b (patch)
tree1665855232160edbf3479c3bcb8df0b3c9509cf5
parentc772aca929479856cbf95f2f77e64fe812bbb445 (diff)
downloadphp-git-790f5ee062c3ce6f986916f30ffb1bf77dc1183b.tar.gz
MFH: fixed bug #45251 (double free or corruption with setAttributeNode())
add test
-rw-r--r--ext/dom/element.c8
-rw-r--r--ext/dom/tests/bug45251.phpt30
2 files changed, 38 insertions, 0 deletions
diff --git a/ext/dom/element.c b/ext/dom/element.c
index 6c6aa17808..a8a1e126d6 100644
--- a/ext/dom/element.c
+++ b/ext/dom/element.c
@@ -592,6 +592,10 @@ PHP_FUNCTION(dom_element_set_attribute_node)
xmlUnlinkNode((xmlNodePtr) existattrp);
}
+ if (attrp->parent != NULL) {
+ xmlUnlinkNode((xmlNodePtr) attrp);
+ }
+
if (attrp->doc == NULL && nodep->doc != NULL) {
attrobj->document = intern->document;
php_libxml_increment_doc_ref((php_libxml_node_object *)attrobj, NULL TSRMLS_CC);
@@ -1012,6 +1016,10 @@ PHP_FUNCTION(dom_element_set_attribute_node_ns)
xmlUnlinkNode((xmlNodePtr) existattrp);
}
+ if (attrp->parent != NULL) {
+ xmlUnlinkNode((xmlNodePtr) attrp);
+ }
+
if (attrp->doc == NULL && nodep->doc != NULL) {
attrobj->document = intern->document;
php_libxml_increment_doc_ref((php_libxml_node_object *)attrobj, NULL TSRMLS_CC);
diff --git a/ext/dom/tests/bug45251.phpt b/ext/dom/tests/bug45251.phpt
new file mode 100644
index 0000000000..652e3b2530
--- /dev/null
+++ b/ext/dom/tests/bug45251.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Bug #45251 (double free or corruption with setAttributeNode())
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+$doc = new DOMDocument;
+$doc->loadXml(<<<EOF
+<?xml version="1.0" encoding="utf-8" ?>
+<aaa>
+ <bbb foo="bar"/>
+</aaa>
+EOF
+);
+
+$xpath = new DOMXPath($doc);
+
+$bbb = $xpath->query('bbb', $doc->documentElement)->item(0);
+
+$ccc = $doc->createElement('ccc');
+foreach ($bbb->attributes as $attr)
+{
+ $ccc->setAttributeNode($attr);
+}
+
+echo $attr->parentNode->localName;
+
+?>
+--EXPECT--
+ccc