@@ -1640,10 +1640,11 @@ PHP_METHOD(SimpleXMLElement, addChild)
16401640{
16411641 php_sxe_object * sxe ;
16421642 char * qname , * value = NULL , * nsuri = NULL ;
1643- size_t qname_len , value_len = 0 , nsuri_len = 0 ;
1643+ size_t qname_len , value_len = 0 , nsuri_len = 0 ;
16441644 xmlNodePtr node , newnode ;
16451645 xmlNsPtr nsptr = NULL ;
16461646 xmlChar * localname , * prefix = NULL ;
1647+ bool free_localname = false;
16471648
16481649 if (zend_parse_parameters (ZEND_NUM_ARGS (), "s|s!s!" ,
16491650 & qname , & qname_len , & value , & value_len , & nsuri , & nsuri_len ) == FAILURE ) {
@@ -1674,7 +1675,9 @@ PHP_METHOD(SimpleXMLElement, addChild)
16741675
16751676 localname = xmlSplitQName2 ((xmlChar * )qname , & prefix );
16761677 if (localname == NULL ) {
1677- localname = xmlStrdup ((xmlChar * )qname );
1678+ localname = (xmlChar * )qname ;
1679+ } else {
1680+ free_localname = true;
16781681 }
16791682
16801683 newnode = xmlNewChild (node , NULL , localname , (xmlChar * )value );
@@ -1694,7 +1697,9 @@ PHP_METHOD(SimpleXMLElement, addChild)
16941697
16951698 node_as_zval_str (sxe , newnode , return_value , SXE_ITER_NONE , localname , prefix , 0 );
16961699
1697- xmlFree (localname );
1700+ if (free_localname ) {
1701+ xmlFree (localname );
1702+ }
16981703 if (prefix != NULL ) {
16991704 xmlFree (prefix );
17001705 }
0 commit comments