From f04e5059bb3611f3fb373f7658f95b09fcee5ff3 Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Thu, 13 Jul 2023 13:34:45 +0200 Subject: [PATCH] Avoid allocations in DOMElement::getAttribute() --- ext/dom/element.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/ext/dom/element.c b/ext/dom/element.c index 366341ede9f..e57871d3113 100644 --- a/ext/dom/element.c +++ b/ext/dom/element.c @@ -205,6 +205,7 @@ PHP_METHOD(DOMElement, getAttribute) dom_object *intern; xmlNodePtr attr; size_t name_len; + bool should_free; id = ZEND_THIS; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) { @@ -218,12 +219,15 @@ PHP_METHOD(DOMElement, getAttribute) switch (attr->type) { case XML_ATTRIBUTE_NODE: value = xmlNodeListGetString(attr->doc, attr->children, 1); + should_free = true; break; case XML_NAMESPACE_DECL: - value = xmlStrdup(((xmlNsPtr)attr)->href); + value = (xmlChar *) ((xmlNsPtr)attr)->href; + should_free = false; break; default: - value = xmlStrdup(((xmlAttributePtr)attr)->defaultValue); + value = (xmlChar *) ((xmlAttributePtr)attr)->defaultValue; + should_free = false; } } @@ -231,7 +235,9 @@ PHP_METHOD(DOMElement, getAttribute) RETURN_EMPTY_STRING(); } else { RETVAL_STRING((char *)value); - xmlFree(value); + if (should_free) { + xmlFree(value); + } } } /* }}} end dom_element_get_attribute */