From d197a131dbc07c8d50a391729a5f6379115aa898 Mon Sep 17 00:00:00 2001 From: Ilia Alshanetsky Date: Wed, 23 Jul 2003 16:44:27 +0000 Subject: [PATCH] MFH: Fixed #24609 (segfault when using replace node across different docs) Patch by: Rob Richards # This patch somehow did not make it into 4.3.X, so on Rob's request in am # MFHing it in. --- ext/domxml/php_domxml.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ext/domxml/php_domxml.c b/ext/domxml/php_domxml.c index b2d132aec2..3a33492224 100644 --- a/ext/domxml/php_domxml.c +++ b/ext/domxml/php_domxml.c @@ -2384,6 +2384,7 @@ PHP_FUNCTION(domxml_node_replace_node) { zval *id, *rv = NULL, *node; xmlNodePtr repnode, nodep, old_repnode; + xmlDocPtr tmpdoc; int ret; DOMXML_GET_THIS_OBJ(nodep, id, le_domxmlnodep); @@ -2394,8 +2395,18 @@ PHP_FUNCTION(domxml_node_replace_node) DOMXML_GET_OBJ(repnode, node, le_domxmlnodep); + tmpdoc = repnode->doc; + old_repnode = xmlReplaceNode(nodep, repnode); + /* ReplaceNode will change the doc for only the first node + so check if doc was changed */ + if (tmpdoc != repnode->doc) { + /* Set doc back to old doc otherwise libxml wont change all sub nodes */ + repnode->doc = tmpdoc; + xmlSetTreeDoc(repnode, old_repnode->doc); + } + DOMXML_RET_OBJ(rv, old_repnode, &ret); } /* }}} */ -- 2.50.1