OSDN Git Service

Remove xmlCleanupParser calls from contrib/xml2.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 1 Mar 2010 05:16:35 +0000 (05:16 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 1 Mar 2010 05:16:35 +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 8e289bd..1ce031f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $PostgreSQL: pgsql/contrib/xml2/xpath.c,v 1.27 2010/02/28 21:31:57 tgl Exp $
+ * $PostgreSQL: pgsql/contrib/xml2/xpath.c,v 1.28 2010/03/01 05:16:35 tgl Exp $
  *
  * Parser interface for DOM-based parser (libxml) rather than
  * stream-based SAX-type parser
@@ -145,12 +145,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);
 }
 
@@ -297,7 +293,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)
@@ -332,7 +327,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)
@@ -371,7 +365,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)
@@ -403,13 +396,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();
 
@@ -440,13 +430,10 @@ xpath_bool(PG_FUNCTION_ARGS)
        pfree(xpath);
 
        if (res == NULL)
-       {
-               xmlCleanupParser();
                PG_RETURN_BOOL(false);
-       }
 
        bRes = xmlXPathCastToBoolean(res);
-       xmlCleanupParser();
+
        PG_RETURN_BOOL(bRes);
 }
 
@@ -469,9 +456,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);
@@ -480,7 +465,6 @@ pgxml_xpath(text *document, xmlChar *xpath)
        comppath = xmlXPathCompile(xpath);
        if (comppath == NULL)
        {
-               xmlCleanupParser();
                xmlFreeDoc(doctree);
                elog_error("XPath Syntax Error", true);
        }
@@ -492,7 +476,6 @@ pgxml_xpath(text *document, xmlChar *xpath)
        if (res == NULL)
        {
                xmlXPathFreeContext(ctxt);
-               /* xmlCleanupParser(); */
                xmlFreeDoc(doctree);
 
                return NULL;
@@ -511,10 +494,8 @@ pgxml_result_to_text(xmlXPathObjectPtr res,
        text       *xpres;
 
        if (res == NULL)
-       {
-               xmlCleanupParser();
                return NULL;
-       }
+
        switch (res->type)
        {
                case XPATH_NODESET:
@@ -536,9 +517,6 @@ pgxml_result_to_text(xmlXPathObjectPtr res,
        xpres = cstring_to_text((char *) xpresstr);
 
        /* Free various storage */
-       xmlCleanupParser();
-       /* xmlFreeDoc(doctree);  -- will die at end of tuple anyway */
-
        xmlFree(xpresstr);
 
        elog_error("XPath error", false);
@@ -779,7 +757,6 @@ xpath_table(PG_FUNCTION_ARGS)
                                        comppath = xmlXPathCompile(xpaths[j]);
                                        if (comppath == NULL)
                                        {
-                                               xmlCleanupParser();
                                                xmlFreeDoc(doctree);
                                                elog_error("XPath Syntax Error", true);
                                        }
@@ -844,8 +821,6 @@ xpath_table(PG_FUNCTION_ARGS)
                        pfree(xmldoc);
        }
 
-       xmlCleanupParser();
-
        tuplestore_donestoring(tupstore);
 
        SPI_finish();
index ddf90f9..4265a56 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $PostgreSQL: pgsql/contrib/xml2/xslt_proc.c,v 1.17 2010/02/28 19:51:37 tgl Exp $
+ * $PostgreSQL: pgsql/contrib/xml2/xslt_proc.c,v 1.18 2010/03/01 05:16:35 tgl Exp $
  *
  * XSLT processing functions (requiring libxslt)
  *
@@ -79,7 +79,6 @@ xslt_process(PG_FUNCTION_ARGS)
 
        if (doctree == NULL)
        {
-               xmlCleanupParser();
                elog_error("error parsing XML document", false);
 
                PG_RETURN_NULL();
@@ -93,7 +92,6 @@ xslt_process(PG_FUNCTION_ARGS)
                if (ssdoc == NULL)
                {
                        xmlFreeDoc(doctree);
-                       xmlCleanupParser();
                        elog_error("error parsing stylesheet as XML document", false);
                        PG_RETURN_NULL();
                }
@@ -108,7 +106,6 @@ xslt_process(PG_FUNCTION_ARGS)
        {
                xmlFreeDoc(doctree);
                xsltCleanupGlobals();
-               xmlCleanupParser();
                elog_error("failed to parse stylesheet", false);
                PG_RETURN_NULL();
        }
@@ -121,7 +118,6 @@ xslt_process(PG_FUNCTION_ARGS)
        xmlFreeDoc(doctree);
 
        xsltCleanupGlobals();
-       xmlCleanupParser();
 
        if (resstat < 0)
                PG_RETURN_NULL();