]> granicus.if.org Git - php/commitdiff
fix bug #39760 (cloning fails on nested SimpleXML-Object)
authorRob Richards <rrichards@php.net>
Sat, 30 Dec 2006 15:41:17 +0000 (15:41 +0000)
committerRob Richards <rrichards@php.net>
Sat, 30 Dec 2006 15:41:17 +0000 (15:41 +0000)
add test

ext/simplexml/simplexml.c
ext/simplexml/tests/bug39760.phpt [new file with mode: 0644]

index 915c1378d094b02c4eaf3c1043419a0a4184d335..d95b61d7ebff8151e6640ee478442b0a43a1ac80 100644 (file)
@@ -1761,6 +1761,16 @@ sxe_object_clone(void *object, void **clone_ptr TSRMLS_DC)
                clone->document->refcount++;
                docp = clone->document->ptr;
        }
+
+       clone->iter.isprefix = sxe->iter.isprefix;
+       if (sxe->iter.name != NULL) {
+               clone->iter.name = xmlStrdup((xmlChar *)sxe->iter.name);
+       }
+       if (sxe->iter.nsprefix != NULL) {
+               clone->iter.nsprefix = xmlStrdup((xmlChar *)sxe->iter.nsprefix);
+       }
+       clone->iter.type = sxe->iter.type;
+
        if (sxe->node) {
                nodep = xmlDocCopyNode(sxe->node->node, docp, 1);
        }
diff --git a/ext/simplexml/tests/bug39760.phpt b/ext/simplexml/tests/bug39760.phpt
new file mode 100644 (file)
index 0000000..e781765
--- /dev/null
@@ -0,0 +1,40 @@
+--TEST--
+Bug #39760 (cloning fails on nested SimpleXML-Object)
+--SKIPIF--
+<?php if (!extension_loaded("simplexml")) print "skip simplexml extension is not loaded"; ?>
+--FILE--
+<?php
+
+$xml = '<?xml version="1.0" ?>
+<test>
+    <level1>
+        <level2a>text1</level2a>
+        <level2b>text2</level2b>
+   </level1>
+</test>';
+$test = simplexml_load_string($xml);
+
+var_dump($test->level1->level2a);
+
+$test2 = clone $test;
+var_dump($test2->level1->level2a);
+
+$test3 = clone $test->level1->level2a;
+var_dump($test3);
+
+echo "Done\n";
+?>
+--EXPECTF--    
+object(SimpleXMLElement)#%d (1) {
+  [0]=>
+  string(5) "text1"
+}
+object(SimpleXMLElement)#%d (1) {
+  [0]=>
+  string(5) "text1"
+}
+object(SimpleXMLElement)#%d (1) {
+  [0]=>
+  string(5) "text1"
+}
+Done