]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Free libxml2/libxslt resources in a safer order.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 27 Nov 2014 16:12:59 +0000 (11:12 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 27 Nov 2014 16:12:59 +0000 (11:12 -0500)
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.

contrib/xml2/xslt_proc.c

index 6603526392d7c4c5abcb7e5181dffd6d0ec187e9..5eb72b4a74045fdacac89fe19441f49ad1ae6d8d 100644 (file)
@@ -140,10 +140,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");
@@ -154,10 +154,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");
@@ -165,11 +165,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();