- SimpleXML:
. Fixed bug #75245 (Don't set content of elements with only whitespaces).
(eriklundin)
+ . Fixed bug #63575 (Root elements are not properly cloned). (cmb)
- sodium:
. Fixed bug #77646 (sign_detached() strings not terminated). (Frank)
php_sxe_object *clone;
xmlNodePtr nodep = NULL;
xmlDocPtr docp = NULL;
+ zend_bool is_root_element = sxe->node && sxe->node->node && sxe->node->node->parent
+ && (sxe->node->node->parent->type == XML_DOCUMENT_NODE || sxe->node->node->parent->type == XML_HTML_DOCUMENT_NODE);
clone = php_sxe_object_new(sxe->zo.ce, sxe->fptr_count);
- clone->document = sxe->document;
- if (clone->document) {
- clone->document->refcount++;
- docp = clone->document->ptr;
+
+ if (is_root_element) {
+ docp = xmlCopyDoc(sxe->document->ptr, 1);
+ php_libxml_increment_doc_ref((php_libxml_node_object *)clone, docp);
+ } else {
+ clone->document = sxe->document;
+ if (clone->document) {
+ clone->document->refcount++;
+ docp = clone->document->ptr;
+ }
}
clone->iter.isprefix = sxe->iter.isprefix;
clone->iter.type = sxe->iter.type;
if (sxe->node) {
- nodep = xmlDocCopyNode(sxe->node->node, docp, 1);
+ if (is_root_element) {
+ nodep = xmlDocGetRootElement(docp);
+ } else {
+ nodep = xmlDocCopyNode(sxe->node->node, docp, 1);
+ }
}
php_libxml_increment_node_ptr((php_libxml_node_object *)clone, nodep, NULL);
--- /dev/null
+--TEST--
+Bug #63575 (Root elements are not properly cloned)
+--SKIPIF--
+<?php
+if (!extension_loaded('simplexml')) die('skip simplexml extension not available');
+?>
+--FILE--
+<?php
+$xml = '<a><b></b></a>';
+
+$o1 = new SimpleXMlElement($xml);
+$o2 = clone $o1;
+
+$r = current($o2->xpath('/a'));
+$r->addChild('c', new SimpleXMlElement('<c></c>'));
+
+echo $o1->asXML(), PHP_EOL, $o2->asXML();
+?>
+--EXPECT--
+<?xml version="1.0"?>
+<a><b/></a>
+
+<?xml version="1.0"?>
+<a><b/><c/></a>