Skip to content

Commit 7896276

Browse files
committed
Prevent string duplication if QName without prefix is given
1 parent 921e178 commit 7896276

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

ext/simplexml/simplexml.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)