From: Alvaro Herrera <alvherre@2ndquadrant.com>
To: Pavel Stehule <pavel.stehule@gmail.com>
Cc: Chapman Flack <chap@anastigmatix.net>
Cc: Markus Winand <markus.winand@winand.at>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Subject: Re: PostgreSQL vs SQL/XML Standards
Date: Fri, 8 Mar 2019 15:44:30 -0300
Message-ID: <20190308184430.GA14852@alvherre.pgsql> (raw)
In-Reply-To: <20190308183417.GA4442@alvherre.pgsql>
On 2019-Mar-08, Alvaro Herrera wrote:
> > Maybe we can call explicitly xmlFreeDoc instead xmlFreeNode
> >
> > some like
> >
> > if (cur_copy->type == XML_DOCUMENT_NODE)
> > xmlFreeDoc((xmlDocPtr) cur_copy);
> > else
> > xmlFreeNode(cur_copy);
> >
> > This looks most correct fix for me. What do you think?
>
> Seems like that should work, yeah ...
Something like this perhaps? Less repetitive ...
--
Álvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Attachments:
[text/x-diff] xml-more-robust-handling-3.patch (2.5K, ../20190308184430.GA14852@alvherre.pgsql/2-xml-more-robust-handling-3.patch)
download | inline diff:diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.cindex 28b3eaaa201..9204d6e9cf6 100644--- a/src/backend/utils/adt/xml.c+++ b/src/backend/utils/adt/xml.c@@ -3720,35 +3720,57 @@ xml_xmlnodetoxmltype(xmlNodePtr cur, PgXmlErrorContext *xmlerrcxt)
if (cur->type != XML_ATTRIBUTE_NODE && cur->type != XML_TEXT_NODE)
{
- xmlBufferPtr buf;- xmlNodePtr cur_copy;-- buf = xmlBufferCreate();-- /*- * The result of xmlNodeDump() won't contain namespace definitions- * from parent nodes, but xmlCopyNode() duplicates a node along with- * its required namespace definitions.- */- cur_copy = xmlCopyNode(cur, 1);-- if (cur_copy == NULL)- xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,- "could not copy node");+ volatile void (*nodefree) (xmlNodePtr) = NULL;+ volatile xmlBufferPtr buf = NULL;+ volatile xmlNodePtr cur_copy = NULL;
PG_TRY();
{
- xmlNodeDump(buf, NULL, cur_copy, 0, 1);+ int bytes;++ buf = xmlBufferCreate();+ if (buf == NULL || xmlerrcxt->err_occurred)+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,+ "could not allocate xmlBuffer");++ /*+ * Produce a dump of the node that we can serialize. xmlNodeDump+ * does that, but the result of that function won't contain+ * namespace definitions from ancestor nodes, so we first do a+ * xmlCopyNode() which duplicates the node along with its required+ * namespace definitions.+ *+ * Some old libxml2 versions such as 2.7.6 produce partially+ * broken XML_DOCUMENT_NODE nodes (unset content field) when+ * copying them. xmlNodeDump of such a node works fine, but+ * xmlFreeNode crashes; set us up to call xmlFreeDoc instead.+ */+ cur_copy = xmlCopyNode(cur, 1);+ if (cur_copy == NULL || xmlerrcxt->err_occurred)+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,+ "could not copy node");+ nodefree = cur_copy->type == XML_DOCUMENT_NODE ?+ (void (*) (xmlNodePtr)) xmlFreeDoc : xmlFreeNode;++ bytes = xmlNodeDump(buf, NULL, cur_copy, 0, 1);+ if (bytes == -1 || xmlerrcxt->err_occurred)+ xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY,+ "could not dump node");+
result = xmlBuffer_to_xmltype(buf);
}
PG_CATCH();
{
- xmlFreeNode(cur_copy);- xmlBufferFree(buf);+ if (nodefree)+ nodefree(cur_copy);+ if (buf)+ xmlBufferFree(buf);
PG_RE_THROW();
}
PG_END_TRY();
- xmlFreeNode(cur_copy);++ if (nodefree)+ nodefree(cur_copy);
xmlBufferFree(buf);
}
else
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: alvherre@2ndquadrant.com, pavel.stehule@gmail.com, chap@anastigmatix.net, markus.winand@winand.at, pgsql-hackers@lists.postgresql.org
Subject: Re: PostgreSQL vs SQL/XML Standards
In-Reply-To: <20190308184430.GA14852@alvherre.pgsql>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox