From cd8ba5af5baeb5a380bc8a8b8aab1ff800a0e69a Mon Sep 17 00:00:00 2001 From: Melvyn Sopacua Date: Tue, 9 Sep 2003 19:43:45 +0000 Subject: [PATCH] Fix #23326: Attributes via append_child not supported Add testcase --- ext/domxml/php_domxml.c | 27 ++++++++++++++++++++++----- ext/domxml/tests/bug23326.phpt | 21 +++++++++++++++++++++ 2 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 ext/domxml/tests/bug23326.phpt 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-- + + -- 2.50.1