From 0d26561bd7821dfe1c02b8dd0c82e8a1f510cc49 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Sat, 30 Jun 2018 17:12:57 -0400 Subject: [PATCH] fix memory leak with creating nodes with a namespace fixes #1771 --- CHANGELOG.md | 7 +++++++ ext/nokogiri/xml_node.c | 14 +++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a7c223502..53bdd044db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# unreleased + +## Bug fixes + +* [MRI] Fix memory leak when creating nodes with namespaces. [#1771] + + # 1.8.3 / 2018-06-16 ## Security Notes diff --git a/ext/nokogiri/xml_node.c b/ext/nokogiri/xml_node.c index 3af6f9a4d4..0b572506de 100644 --- a/ext/nokogiri/xml_node.c +++ b/ext/nokogiri/xml_node.c @@ -30,7 +30,6 @@ typedef xmlNodePtr (*pivot_reparentee_func)(xmlNodePtr, xmlNodePtr); /* :nodoc: */ static void relink_namespace(xmlNodePtr reparented) { - xmlChar *name, *prefix; xmlNodePtr child; xmlNsPtr ns; @@ -38,10 +37,16 @@ static void relink_namespace(xmlNodePtr reparented) reparented->type != XML_ELEMENT_NODE) { return; } if (reparented->ns == NULL || reparented->ns->prefix == NULL) { + xmlChar *name = 0, *prefix = 0; + name = xmlSplitQName2(reparented->name, &prefix); - if(reparented->type == XML_ATTRIBUTE_NODE) { - if (prefix == NULL || strcmp((char*)prefix, XMLNS_PREFIX) == 0) { return; } + if (reparented->type == XML_ATTRIBUTE_NODE) { + if (prefix == NULL || strcmp((char*)prefix, XMLNS_PREFIX) == 0) { + xmlFree(name); + xmlFree(prefix); + return; + } } ns = xmlSearchNs(reparented->doc, reparented, prefix); @@ -54,6 +59,9 @@ static void relink_namespace(xmlNodePtr reparented) xmlNodeSetName(reparented, name); xmlSetNs(reparented, ns); } + + xmlFree(name); + xmlFree(prefix); } /* Avoid segv when relinking against unlinked nodes. */