summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2008-03-26 01:19:31 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2008-03-26 01:19:31 +0000
commite5e66ac021fbbe4fd60b98511b68b6157ff2273a (patch)
tree3c480eacd114b8284e9f6cf2273e744ec3591888 /contrib
parentc1df51585f17073ea47b63024ca1c8dfa3a944f8 (diff)
downloadpostgresql-e5e66ac021fbbe4fd60b98511b68b6157ff2273a.tar.gz
Fix core dump in contrib/xml2's xpath_table() when the input query returns
a NULL value. Per bug #4058.
Diffstat (limited to 'contrib')
-rw-r--r--contrib/xml2/xpath.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c
index c15a5bb622..268937e38b 100644
--- a/contrib/xml2/xpath.c
+++ b/contrib/xml2/xpath.c
@@ -801,12 +801,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.
@@ -820,12 +818,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);
@@ -917,8 +917,10 @@ xpath_table(PG_FUNCTION_ARGS)
xmlFreeDoc(doctree);
- pfree(pkey);
- pfree(xmldoc);
+ if (pkey)
+ pfree(pkey);
+ if (xmldoc)
+ pfree(xmldoc);
}
xmlCleanupParser();