diff --git a/contrib/xml2/xslt_proc.c b/contrib/xml2/xslt_proc.c index 830acd42f8c..d6061d08341 100644 --- a/contrib/xml2/xslt_proc.c +++ b/contrib/xml2/xslt_proc.c @@ -116,6 +116,16 @@ xslt_process(PG_FUNCTION_ARGS) } restree = xsltApplyStylesheet(stylesheet, doctree, params); + + if (restree == NULL) + { + xsltFreeStylesheet(stylesheet); + xmlFreeDoc(doctree); + xsltCleanupGlobals(); + xml_ereport(ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION, + "failed to apply stylesheet"); + } + resstat = xsltSaveResultToString(&resstr, &reslen, restree, stylesheet); xsltFreeStylesheet(stylesheet); @@ -124,6 +134,7 @@ xslt_process(PG_FUNCTION_ARGS) xsltCleanupGlobals(); + /* XXX this is pretty dubious, really ought to throw error instead */ if (resstat < 0) PG_RETURN_NULL(); @@ -131,6 +142,9 @@ xslt_process(PG_FUNCTION_ARGS) memcpy(VARDATA(tres), resstr, reslen); SET_VARSIZE(tres, reslen + VARHDRSZ); + if (resstr) + xmlFree(resstr); + PG_RETURN_TEXT_P(tres); #else /* !USE_LIBXSLT */