rrichards Sat Jul 28 08:34:10 2007 UTC Modified files: /php-src/ext/libxml libxml.c /php-src/ext/libxml/tests bug42112.phpt Log: MFB: Fixed Bug #42112 (deleting a node produces memory corruption) add test http://cvs.php.net/viewvc.cgi/php-src/ext/libxml/libxml.c?r1=1.61&r2=1.62&diff_format=u Index: php-src/ext/libxml/libxml.c diff -u php-src/ext/libxml/libxml.c:1.61 php-src/ext/libxml/libxml.c:1.62 --- php-src/ext/libxml/libxml.c:1.61 Sat Jul 21 00:49:53 2007 +++ php-src/ext/libxml/libxml.c Sat Jul 28 08:34:09 2007 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: libxml.c,v 1.61 2007/07/21 00:49:53 jani Exp $ */ +/* $Id: libxml.c,v 1.62 2007/07/28 08:34:09 rrichards Exp $ */ #define IS_EXT_MODULE @@ -240,11 +240,14 @@ case XML_ENTITY_REF_NODE: php_libxml_node_free_list((xmlNodePtr) node->properties TSRMLS_CC); break; + case XML_ATTRIBUTE_NODE: + if ((node->doc != NULL) && (((xmlAttrPtr) node)->atype == XML_ATTRIBUTE_ID)) { + xmlRemoveID(node->doc, (xmlAttrPtr) node); + } case XML_ATTRIBUTE_DECL: case XML_DTD_NODE: case XML_DOCUMENT_TYPE_NODE: case XML_ENTITY_DECL: - case XML_ATTRIBUTE_NODE: case XML_NAMESPACE_DECL: case XML_TEXT_NODE: php_libxml_node_free_list(node->children TSRMLS_CC); http://cvs.php.net/viewvc.cgi/php-src/ext/libxml/tests/bug42112.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/libxml/tests/bug42112.phpt diff -u /dev/null php-src/ext/libxml/tests/bug42112.phpt:1.2 --- /dev/null Sat Jul 28 08:34:10 2007 +++ php-src/ext/libxml/tests/bug42112.phpt Sat Jul 28 08:34:09 2007 @@ -0,0 +1,31 @@ +--TEST-- +Bug #42112 (deleting a node produces memory corruption) +--SKIPIF-- +<?php if (!extension_loaded('dom')) die('skip'); ?> +--FILE-- +<?php +$xml = <<<EOXML +<root><child xml:id="id1">baz</child></root> +EOXML; + +function remove_node($doc) { + $node = $doc->getElementById( 'id1' ); + print 'Deleting Node: '.$node->nodeName."\n"; + $node->parentNode->removeChild( $node ); +} + +$doc = new DOMDocument(); +$doc->loadXML($xml); + +remove_node($doc); + +$node = $doc->getElementById( 'id1' ); +if ($node) { + print 'Found Node: '.$node->nodeName."\n"; +} +$root = $doc->documentElement; +print 'Root Node: '.$root->nodeName."\n"; +?> +--EXPECT-- +Deleting Node: child +Root Node: root
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php