Skip to content

Commit d9fd443

Browse files
committed
Merge branch 'PHP-7.0' into PHP-7.1
2 parents bfedff5 + d027bc2 commit d9fd443

File tree

5 files changed

+30
-1
lines changed

5 files changed

+30
-1
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ PHP NEWS
1111
. Fixed bug #74639 (implement clone for DatePeriod and DateInterval).
1212
(andrewnester)
1313

14+
- DOM:
15+
. Fixed bug #69373 (References to deleted XPath query results). (ttoohey)
16+
1417
- Intl:
1518
. Fixed bug #73473 (Stack Buffer Overflow in msgfmt_parse_message). (libnex)
1619

ext/dom/node.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,8 @@ int dom_node_node_value_write(dom_object *obj, zval *newval)
337337
case XML_ATTRIBUTE_NODE:
338338
if (nodep->children) {
339339
node_list_unlink(nodep->children);
340+
php_libxml_node_free_list((xmlNodePtr) nodep->children);
341+
nodep->children = NULL;
340342
}
341343
case XML_TEXT_NODE:
342344
case XML_COMMENT_NODE:
@@ -854,6 +856,14 @@ int dom_node_text_content_write(dom_object *obj, zval *newval)
854856
return FAILURE;
855857
}
856858

859+
if (nodep->type == XML_ELEMENT_NODE || nodep->type == XML_ATTRIBUTE_NODE) {
860+
if (nodep->children) {
861+
node_list_unlink(nodep->children);
862+
php_libxml_node_free_list((xmlNodePtr) nodep->children);
863+
nodep->children = NULL;
864+
}
865+
}
866+
857867
str = zval_get_string(newval);
858868
/* we have to use xmlNodeAddContent() to get the same behavior as with xmlNewText() */
859869
xmlNodeSetContent(nodep, (xmlChar *) "");

ext/dom/tests/bug69373.phpt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
--TEST--
2+
Bug #69373 References to deleted XPath query results
3+
--FILE--
4+
<?php
5+
$doc = new DOMDocument();
6+
for( $i=0; $i<20; $i++ ) {
7+
$doc->loadXML("<parent><child /><child /></parent>");
8+
$xpath = new DOMXpath($doc);
9+
$all = $xpath->query('//*');
10+
$doc->firstChild->nodeValue = '';
11+
}
12+
echo 'DONE', PHP_EOL;
13+
?>
14+
--EXPECT--
15+
DONE

ext/libxml/libxml.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ static void php_libxml_node_free(xmlNodePtr node)
224224
}
225225
}
226226

227-
static void php_libxml_node_free_list(xmlNodePtr node)
227+
PHP_LIBXML_API void php_libxml_node_free_list(xmlNodePtr node)
228228
{
229229
xmlNodePtr curnode;
230230

ext/libxml/php_libxml.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ PHP_LIBXML_API int php_libxml_decrement_doc_ref(php_libxml_node_object *object);
100100
PHP_LIBXML_API xmlNodePtr php_libxml_import_node(zval *object);
101101
PHP_LIBXML_API zval *php_libxml_register_export(zend_class_entry *ce, php_libxml_export_node export_function);
102102
/* When an explicit freeing of node and children is required */
103+
PHP_LIBXML_API void php_libxml_node_free_list(xmlNodePtr node);
103104
PHP_LIBXML_API void php_libxml_node_free_resource(xmlNodePtr node);
104105
/* When object dtor is called as node may still be referenced */
105106
PHP_LIBXML_API void php_libxml_node_decrement_resource(php_libxml_node_object *object);

0 commit comments

Comments
 (0)