From: Melvyn Sopacua Date: Tue, 9 Sep 2003 19:43:45 +0000 (+0000) Subject: Fix #23326: Attributes via append_child not supported X-Git-Tag: php-4.3.4RC1~83 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cd8ba5af5baeb5a380bc8a8b8aab1ff800a0e69a;p=php Fix #23326: Attributes via append_child not supported Add testcase --- diff --git a/ext/domxml/php_domxml.c b/ext/domxml/php_domxml.c index f6666c0e57..e222d462e5 100644 --- a/ext/domxml/php_domxml.c +++ b/ext/domxml/php_domxml.c @@ -2425,11 +2425,6 @@ PHP_FUNCTION(domxml_node_append_child) DOMXML_GET_OBJ(child, node, le_domxmlnodep); - if (child->type == XML_ATTRIBUTE_NODE) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't append attribute node"); - RETURN_FALSE; - } - /* XXX:ls */ if (child == parent) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't append node to itself"); @@ -2469,6 +2464,28 @@ PHP_FUNCTION(domxml_node_append_child) } } /* end libxml2 code */ + else if (child->type == XML_ATTRIBUTE_NODE) { + if (parent->properties != NULL) { + /* Check if an attribute with the same name exists */ + xmlAttrPtr foundattrp; + if (child->ns == NULL) + foundattrp = xmlHasProp(parent, child->name); + else + foundattrp = xmlHasNsProp(parent, child->name, child->ns->href); + if ((foundattrp != NULL) && (foundattrp != (xmlAttrPtr) child)) { + xmlUnlinkNode((xmlNodePtr) foundattrp); + (void)xmlCopyProp(parent, (xmlAttrPtr) child); + /* We're in the dark here, what happened to the parent, let's + * assume it's handled properly and return the new(?) parent + */ + new_child = parent; + } + } + /* For all other intents and purposes fall through to the xmlAddChild + * call + */ + } + if (NULL == new_child) { new_child = xmlAddChild(parent, child); diff --git a/ext/domxml/tests/bug23326.phpt b/ext/domxml/tests/bug23326.phpt new file mode 100644 index 0000000000..03abe3ab90 --- /dev/null +++ b/ext/domxml/tests/bug23326.phpt @@ -0,0 +1,21 @@ +--TEST-- +Attributes via append_child not supported (bug #23326) +--SKIPIF-- + +--FILE-- +create_element('test'); +$j = 0; +for($i=0;$i<10;$i++) +{ + if( $j < 5 ) + $j = $i; + $test->append_child($document->create_attribute("key$j", $i)); +} +$document->append_child($test); +echo $document->dump_mem(1); +?> +--EXPECT-- + +