File tree 4 files changed +46
-7
lines changed
4 files changed +46
-7
lines changed Original file line number Diff line number Diff line change @@ -154,6 +154,7 @@ PHP NEWS
154
154
- SimpleXML:
155
155
. Fixed bug #75245 (Don't set content of elements with only whitespaces).
156
156
(eriklundin)
157
+ . Fixed bug #63575 (Root elements are not properly cloned). (cmb)
157
158
158
159
- sodium:
159
160
. Fixed bug #77646 (sign_detached() strings not terminated). (Frank)
Original file line number Diff line number Diff line change @@ -2035,12 +2035,20 @@ sxe_object_clone(zend_object *object)
2035
2035
php_sxe_object * clone ;
2036
2036
xmlNodePtr nodep = NULL ;
2037
2037
xmlDocPtr docp = NULL ;
2038
+ zend_bool is_root_element = sxe -> node && sxe -> node -> node && sxe -> node -> node -> parent
2039
+ && (sxe -> node -> node -> parent -> type == XML_DOCUMENT_NODE || sxe -> node -> node -> parent -> type == XML_HTML_DOCUMENT_NODE );
2038
2040
2039
2041
clone = php_sxe_object_new (sxe -> zo .ce , sxe -> fptr_count );
2040
- clone -> document = sxe -> document ;
2041
- if (clone -> document ) {
2042
- clone -> document -> refcount ++ ;
2043
- docp = clone -> document -> ptr ;
2042
+
2043
+ if (is_root_element ) {
2044
+ docp = xmlCopyDoc (sxe -> document -> ptr , 1 );
2045
+ php_libxml_increment_doc_ref ((php_libxml_node_object * )clone , docp );
2046
+ } else {
2047
+ clone -> document = sxe -> document ;
2048
+ if (clone -> document ) {
2049
+ clone -> document -> refcount ++ ;
2050
+ docp = clone -> document -> ptr ;
2051
+ }
2044
2052
}
2045
2053
2046
2054
clone -> iter .isprefix = sxe -> iter .isprefix ;
@@ -2053,7 +2061,11 @@ sxe_object_clone(zend_object *object)
2053
2061
clone -> iter .type = sxe -> iter .type ;
2054
2062
2055
2063
if (sxe -> node ) {
2056
- nodep = xmlDocCopyNode (sxe -> node -> node , docp , 1 );
2064
+ if (is_root_element ) {
2065
+ nodep = xmlDocGetRootElement (docp );
2066
+ } else {
2067
+ nodep = xmlDocCopyNode (sxe -> node -> node , docp , 1 );
2068
+ }
2057
2069
}
2058
2070
2059
2071
php_libxml_increment_node_ptr ((php_libxml_node_object * )clone , nodep , NULL );
Original file line number Diff line number Diff line change @@ -23,7 +23,9 @@ object(SimpleXMLElement)#%d (0) {
23
23
}
24
24
object(SimpleXMLElement)#%d (0) {
25
25
}
26
- string(15) "<test>
26
+ string(%d) "<? xml version="1.0 " encoding="utf-8 "?>
27
+ <test>
27
28
28
- </test>"
29
+ </test>
30
+ "
29
31
Done
Original file line number Diff line number Diff line change
1
+ --TEST--
2
+ Bug #63575 (Root elements are not properly cloned)
3
+ --SKIPIF--
4
+ <?php
5
+ if (!extension_loaded ('simplexml ' )) die ('skip simplexml extension not available ' );
6
+ ?>
7
+ --FILE--
8
+ <?php
9
+ $ xml = '<a><b></b></a> ' ;
10
+
11
+ $ o1 = new SimpleXMlElement ($ xml );
12
+ $ o2 = clone $ o1 ;
13
+
14
+ $ r = current ($ o2 ->xpath ('/a ' ));
15
+ $ r ->addChild ('c ' , new SimpleXMlElement ('<c></c> ' ));
16
+
17
+ echo $ o1 ->asXML (), PHP_EOL , $ o2 ->asXML ();
18
+ ?>
19
+ --EXPECT--
20
+ <? xml version="1.0 "?>
21
+ <a><b/></a>
22
+
23
+ <? xml version="1.0 "?>
24
+ <a><b/><c/></a>
You can’t perform that action at this time.
0 commit comments