Remove xmlCleanupParser calls from contrib/xml2.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 1 Mar 2010 05:16:54 +0000 (05:16 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 1 Mar 2010 05:16:54 +0000 (05:16 +0000)
These are unnecessary and probably dangerous.  I don't see any immediate
risk situations in the core XML support or contrib/xml2 itself, but there
could be issues with external uses of libxml2, and in any case it's an
accident waiting to happen.

contrib/xml2/xpath.c
contrib/xml2/xslt_proc.c

index 4151398a1f619d59b7814cbba94d9d2096ab0589..9c091c9572ca144114ae01caf4ce2a0f258171a5 100644 (file)
@@ -142,12 +142,8 @@ xml_is_well_formed(PG_FUNCTION_ARGS)
 
    doctree = xmlParseMemory((char *) VARDATA(t), docsize);
    if (doctree == NULL)
-   {
-       xmlCleanupParser();
        PG_RETURN_BOOL(false);  /* i.e. not well-formed */
-   }
    xmlFreeDoc(doctree);
-   xmlCleanupParser();
    PG_RETURN_BOOL(true);
 }
 
@@ -305,7 +301,6 @@ xpath_nodeset(PG_FUNCTION_ARGS)
    xpres = pgxml_result_to_text(pgxml_xpath(PG_GETARG_TEXT_P(0), xpath),
                                 toptag, septag, NULL);
 
-   /* xmlCleanupParser(); done by result_to_text routine */
    pfree(xpath);
 
    if (xpres == NULL)
@@ -340,7 +335,6 @@ xpath_list(PG_FUNCTION_ARGS)
    xpres = pgxml_result_to_text(pgxml_xpath(PG_GETARG_TEXT_P(0), xpath),
                                 NULL, NULL, plainsep);
 
-   /* xmlCleanupParser(); done by result_to_text routine */
    pfree(xpath);
 
    if (xpres == NULL)
@@ -379,7 +373,6 @@ xpath_string(PG_FUNCTION_ARGS)
    xpres = pgxml_result_to_text(pgxml_xpath(PG_GETARG_TEXT_P(0), xpath),
                                 NULL, NULL, NULL);
 
-   xmlCleanupParser();
    pfree(xpath);
 
    if (xpres == NULL)
@@ -411,13 +404,10 @@ xpath_number(PG_FUNCTION_ARGS)
    pfree(xpath);
 
    if (res == NULL)
-   {
-       xmlCleanupParser();
        PG_RETURN_NULL();
-   }
 
    fRes = xmlXPathCastToNumber(res);
-   xmlCleanupParser();
+
    if (xmlXPathIsNaN(fRes))
        PG_RETURN_NULL();
 
@@ -448,13 +438,10 @@ xpath_bool(PG_FUNCTION_ARGS)
    pfree(xpath);
 
    if (res == NULL)
-   {
-       xmlCleanupParser();
        PG_RETURN_BOOL(false);
-   }
 
    bRes = xmlXPathCastToBoolean(res);
-   xmlCleanupParser();
+
    PG_RETURN_BOOL(bRes);
 }
 
@@ -477,9 +464,7 @@ pgxml_xpath(text *document, xmlChar *xpath)
 
    doctree = xmlParseMemory((char *) VARDATA(document), docsize);
    if (doctree == NULL)
-   {                           /* not well-formed */
-       return NULL;
-   }
+       return NULL;            /* not well-formed */
 
    ctxt = xmlXPathNewContext(doctree);
    ctxt->node = xmlDocGetRootElement(doctree);
@@ -488,7 +473,6 @@ pgxml_xpath(text *document, xmlChar *xpath)
    comppath = xmlXPathCompile(xpath);
    if (comppath == NULL)
    {
-       xmlCleanupParser();
        xmlFreeDoc(doctree);
        elog_error("XPath Syntax Error", true);
    }
@@ -500,7 +484,6 @@ pgxml_xpath(text *document, xmlChar *xpath)
    if (res == NULL)
    {
        xmlXPathFreeContext(ctxt);
-       /* xmlCleanupParser(); */
        xmlFreeDoc(doctree);
 
        return NULL;
@@ -520,10 +503,8 @@ pgxml_result_to_text(xmlXPathObjectPtr res,
    text       *xpres;
 
    if (res == NULL)
-   {
-       xmlCleanupParser();
        return NULL;
-   }
+
    switch (res->type)
    {
        case XPATH_NODESET:
@@ -548,9 +529,6 @@ pgxml_result_to_text(xmlXPathObjectPtr res,
    VARATT_SIZEP(xpres) = ressize + VARHDRSZ;
 
    /* Free various storage */
-   xmlCleanupParser();
-   /* xmlFreeDoc(doctree);  -- will die at end of tuple anyway */
-
    xmlFree(xpresstr);
 
    elog_error("XPath error", false);
@@ -789,7 +767,6 @@ xpath_table(PG_FUNCTION_ARGS)
                    comppath = xmlXPathCompile(xpaths[j]);
                    if (comppath == NULL)
                    {
-                       xmlCleanupParser();
                        xmlFreeDoc(doctree);
                        elog_error("XPath Syntax Error", true);
                    }
@@ -854,8 +831,6 @@ xpath_table(PG_FUNCTION_ARGS)
            pfree(xmldoc);
    }
 
-   xmlCleanupParser();
-
    tuplestore_donestoring(tupstore);
 
    SPI_finish();
index a38ab5a7a8707a2c683281c996e1ba46007ce18c..4c45422b496e03604ea19f31a89d3a12e4e86cc7 100644 (file)
@@ -80,7 +80,6 @@ xslt_process(PG_FUNCTION_ARGS)
 
    if (doctree == NULL)
    {
-       xmlCleanupParser();
        elog_error("error parsing XML document", false);
 
        PG_RETURN_NULL();
@@ -94,7 +93,6 @@ xslt_process(PG_FUNCTION_ARGS)
        if (ssdoc == NULL)
        {
            xmlFreeDoc(doctree);
-           xmlCleanupParser();
            elog_error("error parsing stylesheet as XML document", false);
            PG_RETURN_NULL();
        }
@@ -109,7 +107,6 @@ xslt_process(PG_FUNCTION_ARGS)
    {
        xmlFreeDoc(doctree);
        xsltCleanupGlobals();
-       xmlCleanupParser();
        elog_error("failed to parse stylesheet", false);
        PG_RETURN_NULL();
    }
@@ -122,7 +119,6 @@ xslt_process(PG_FUNCTION_ARGS)
    xmlFreeDoc(doctree);
 
    xsltCleanupGlobals();
-   xmlCleanupParser();
 
    if (resstat < 0)
        PG_RETURN_NULL();