summaryrefslogtreecommitdiff
path: root/ext/dom
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2017-06-03 00:42:38 +0200
committerNikita Popov <nikita.ppv@gmail.com>2017-06-03 00:42:38 +0200
commitd9886614dcfdd8e03015814804249a57b26ba9d0 (patch)
tree4999e610ad323af0be69a52a766d1edad6f9c496 /ext/dom
parentc6c1e75e6ba082b6d57f71c28d316b6db4fda6c7 (diff)
parentd9fd44366d7d3f32563833b48ee0c304e4b506bf (diff)
downloadphp-git-d9886614dcfdd8e03015814804249a57b26ba9d0.tar.gz
Merge branch 'PHP-7.1'
Diffstat (limited to 'ext/dom')
-rw-r--r--ext/dom/node.c10
-rw-r--r--ext/dom/tests/bug69373.phpt15
2 files changed, 25 insertions, 0 deletions
diff --git a/ext/dom/node.c b/ext/dom/node.c
index 0f8b759b0e..a9499a96aa 100644
--- a/ext/dom/node.c
+++ b/ext/dom/node.c
@@ -337,6 +337,8 @@ int dom_node_node_value_write(dom_object *obj, zval *newval)
case XML_ATTRIBUTE_NODE:
if (nodep->children) {
node_list_unlink(nodep->children);
+ php_libxml_node_free_list((xmlNodePtr) nodep->children);
+ nodep->children = NULL;
}
case XML_TEXT_NODE:
case XML_COMMENT_NODE:
@@ -854,6 +856,14 @@ int dom_node_text_content_write(dom_object *obj, zval *newval)
return FAILURE;
}
+ if (nodep->type == XML_ELEMENT_NODE || nodep->type == XML_ATTRIBUTE_NODE) {
+ if (nodep->children) {
+ node_list_unlink(nodep->children);
+ php_libxml_node_free_list((xmlNodePtr) nodep->children);
+ nodep->children = NULL;
+ }
+ }
+
str = zval_get_string(newval);
/* we have to use xmlNodeAddContent() to get the same behavior as with xmlNewText() */
xmlNodeSetContent(nodep, (xmlChar *) "");
diff --git a/ext/dom/tests/bug69373.phpt b/ext/dom/tests/bug69373.phpt
new file mode 100644
index 0000000000..d04ac03983
--- /dev/null
+++ b/ext/dom/tests/bug69373.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Bug #69373 References to deleted XPath query results
+--FILE--
+<?php
+$doc = new DOMDocument();
+for( $i=0; $i<20; $i++ ) {
+ $doc->loadXML("<parent><child /><child /></parent>");
+ $xpath = new DOMXpath($doc);
+ $all = $xpath->query('//*');
+ $doc->firstChild->nodeValue = '';
+}
+echo 'DONE', PHP_EOL;
+?>
+--EXPECT--
+DONE