From 22a113b99c883753762bb637eb7a2a50dca67b10 Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Sat, 4 May 2024 13:59:43 +0200 Subject: [PATCH] Try to use an interned local name in createElementNS (#14127) --- ext/dom/document.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ext/dom/document.c b/ext/dom/document.c index 5706c3d959f..9609fce4ffb 100644 --- a/ext/dom/document.c +++ b/ext/dom/document.c @@ -912,7 +912,17 @@ PHP_METHOD(DOM_Document, createElementNS) if (errorcode == 0) { php_dom_libxml_ns_mapper *ns_mapper = php_dom_get_ns_mapper(intern); xmlNsPtr ns = php_dom_libxml_ns_mapper_get_ns_raw_prefix_string(ns_mapper, prefix, xmlStrlen(prefix), uri); - xmlNodePtr nodep = xmlNewDocNodeEatName(docp, ns, localname, NULL); + + /* Try to create the node with the local name interned. */ + const xmlChar *interned_localname = xmlDictLookup(docp->dict, localname, -1); + xmlNodePtr nodep; + if (interned_localname == NULL) { + nodep = xmlNewDocNodeEatName(docp, ns, localname, NULL); + } else { + xmlFree(localname); + nodep = xmlNewDocNodeEatName(docp, ns, BAD_CAST interned_localname, NULL); + } + if (UNEXPECTED(nodep == NULL)) { php_dom_throw_error(INVALID_STATE_ERR, /* strict */ true); } else {