Fix core dump in contrib/xml2's xpath_table() when the input query returns
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 26 Mar 2008 01:19:11 +0000 (01:19 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 26 Mar 2008 01:19:11 +0000 (01:19 +0000)
a NULL value.  Per bug #4058.

contrib/xml2/xpath.c

index b02f957777289e200547e83ef40462d529c7531a..828545c763c4f6fcef4929cbb07da5a0c3142f6b 100644 (file)
@@ -808,12 +808,10 @@ xpath_table(PG_FUNCTION_ARGS)
        xmlXPathCompExprPtr comppath;
 
        /* Extract the row data as C Strings */
-
        spi_tuple = tuptable->vals[i];
        pkey = SPI_getvalue(spi_tuple, spi_tupdesc, 1);
        xmldoc = SPI_getvalue(spi_tuple, spi_tupdesc, 2);
 
-
        /*
         * Clear the values array, so that not-well-formed documents return
         * NULL in all columns.
@@ -827,11 +825,14 @@ xpath_table(PG_FUNCTION_ARGS)
        values[0] = pkey;
 
        /* Parse the document */
-       doctree = xmlParseMemory(xmldoc, strlen(xmldoc));
+       if (xmldoc)
+           doctree = xmlParseMemory(xmldoc, strlen(xmldoc));
+       else                    /* treat NULL as not well-formed */
+           doctree = NULL;
 
        if (doctree == NULL)
-       {                       /* not well-formed, so output all-NULL tuple */
-
+       {
+           /* not well-formed, so output all-NULL tuple */
            ret_tuple = BuildTupleFromCStrings(attinmeta, values);
            oldcontext = MemoryContextSwitchTo(per_query_ctx);
            tuplestore_puttuple(tupstore, ret_tuple);
@@ -923,8 +924,10 @@ xpath_table(PG_FUNCTION_ARGS)
 
        xmlFreeDoc(doctree);
 
-       pfree(pkey);
-       pfree(xmldoc);
+       if (pkey)
+           pfree(pkey);
+       if (xmldoc)
+           pfree(xmldoc);
    }
 
    xmlCleanupParser();