]> granicus.if.org Git - php/commitdiff
fix #39662 (Segfault when calling asXML() of a cloned SimpleXMLElement)
authorAntony Dovgal <tony2001@php.net>
Tue, 28 Nov 2006 18:57:37 +0000 (18:57 +0000)
committerAntony Dovgal <tony2001@php.net>
Tue, 28 Nov 2006 18:57:37 +0000 (18:57 +0000)
ext/simplexml/simplexml.c
ext/simplexml/tests/bug39662.phpt [new file with mode: 0644]

index 909bdef2f358428ae5b6f871228eab14b87821b4..a8129efd4e96be1c20333aaec56e2e176be5d7a5 100644 (file)
@@ -1784,6 +1784,7 @@ sxe_object_clone(void *object, void **clone_ptr TSRMLS_DC)
        }
        if (sxe->node) {
                nodep = xmlDocCopyNode(sxe->node->node, docp, 1);
+               nodep->parent = sxe->node->node->parent;
        }
 
        php_libxml_increment_node_ptr((php_libxml_node_object *)clone, nodep, NULL TSRMLS_CC);
diff --git a/ext/simplexml/tests/bug39662.phpt b/ext/simplexml/tests/bug39662.phpt
new file mode 100644 (file)
index 0000000..c55df8b
--- /dev/null
@@ -0,0 +1,58 @@
+--TEST--
+Bug #39662 (Segfault when calling asXML() of a cloned SimpleXMLElement)
+--SKIPIF--
+<?php if (!extension_loaded("simplexml")) print "skip simplexml extension is not loaded"; ?>
+--FILE--
+<?php
+
+$xml = b'<?xml version="1.0" encoding="utf-8" ?>
+<test>
+
+</test>';
+
+$root = simplexml_load_string($xml);
+$clone = clone $root;
+var_dump($root);
+var_dump($clone);
+var_dump($clone->asXML());
+
+echo "Done\n";
+?>
+--EXPECTF--    
+object(SimpleXMLElement)#%d (1) {
+  [0]=>
+  string(2) "
+
+"
+}
+object(SimpleXMLElement)#%d (1) {
+  [0]=>
+  string(2) "
+
+"
+}
+string(55) "<?xml version="1.0" encoding="utf-8"?>
+<test>
+
+</test>
+"
+Done
+--UEXPECTF--
+object(SimpleXMLElement)#%d (1) {
+  [0]=>
+  unicode(2) "
+
+"
+}
+object(SimpleXMLElement)#%d (1) {
+  [0]=>
+  unicode(2) "
+
+"
+}
+string(55) "<?xml version="1.0" encoding="utf-8"?>
+<test>
+
+</test>
+"
+Done