diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2017-06-03 00:42:38 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2017-06-03 00:42:38 +0200 |
commit | d9886614dcfdd8e03015814804249a57b26ba9d0 (patch) | |
tree | 4999e610ad323af0be69a52a766d1edad6f9c496 /ext/dom | |
parent | c6c1e75e6ba082b6d57f71c28d316b6db4fda6c7 (diff) | |
parent | d9fd44366d7d3f32563833b48ee0c304e4b506bf (diff) | |
download | php-git-d9886614dcfdd8e03015814804249a57b26ba9d0.tar.gz |
Merge branch 'PHP-7.1'
Diffstat (limited to 'ext/dom')
-rw-r--r-- | ext/dom/node.c | 10 | ||||
-rw-r--r-- | ext/dom/tests/bug69373.phpt | 15 |
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 |