From: Tom Lane Date: Thu, 27 Nov 2014 16:13:03 +0000 (-0500) Subject: Free libxml2/libxslt resources in a safer order. X-Git-Tag: REL9_0_19~56 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6a694bbab20395603d751c9575746a753678aa5c;p=thirdparty%2Fpostgresql.git Free libxml2/libxslt resources in a safer order. Mark Simonetti reported that libxslt sometimes crashes for him, and that swapping xslt_process's object-freeing calls around to do them in reverse order of creation seemed to fix it. I've not reproduced the crash, but valgrind clearly shows a reference to already-freed memory, which is consistent with the idea that shutdown of the xsltTransformContext is trying to reference the already-freed stylesheet or input document. With this patch, valgrind is no longer unhappy. I have an inquiry in to see if this is a libxslt bug or if we're just abusing the library; but even if it's a library bug, we'd want to adjust our code so it doesn't fail with unpatched libraries. Back-patch to all supported branches, because we've been doing this in the wrong(?) order for a long time. --- diff --git a/contrib/xml2/xslt_proc.c b/contrib/xml2/xslt_proc.c index 6e4bf550517..d56aa317000 100644 --- a/contrib/xml2/xslt_proc.c +++ b/contrib/xml2/xslt_proc.c @@ -139,10 +139,10 @@ xslt_process(PG_FUNCTION_ARGS) if (xslt_sec_prefs_error) { + xsltFreeTransformContext(xslt_ctxt); + xsltFreeSecurityPrefs(xslt_sec_prefs); xsltFreeStylesheet(stylesheet); xmlFreeDoc(doctree); - xsltFreeSecurityPrefs(xslt_sec_prefs); - xsltFreeTransformContext(xslt_ctxt); xsltCleanupGlobals(); xml_ereport(ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION, "could not set libxslt security preferences"); @@ -153,10 +153,10 @@ xslt_process(PG_FUNCTION_ARGS) if (restree == NULL) { + xsltFreeTransformContext(xslt_ctxt); + xsltFreeSecurityPrefs(xslt_sec_prefs); xsltFreeStylesheet(stylesheet); xmlFreeDoc(doctree); - xsltFreeSecurityPrefs(xslt_sec_prefs); - xsltFreeTransformContext(xslt_ctxt); xsltCleanupGlobals(); xml_ereport(ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION, "failed to apply stylesheet"); @@ -164,11 +164,11 @@ xslt_process(PG_FUNCTION_ARGS) resstat = xsltSaveResultToString(&resstr, &reslen, restree, stylesheet); - xsltFreeStylesheet(stylesheet); xmlFreeDoc(restree); - xmlFreeDoc(doctree); - xsltFreeSecurityPrefs(xslt_sec_prefs); xsltFreeTransformContext(xslt_ctxt); + xsltFreeSecurityPrefs(xslt_sec_prefs); + xsltFreeStylesheet(stylesheet); + xmlFreeDoc(doctree); xsltCleanupGlobals();