From: Tom Lane Date: Wed, 26 Mar 2008 01:19:11 +0000 (+0000) Subject: Fix core dump in contrib/xml2's xpath_table() when the input query returns X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=d841d2282fe1157b71d875e611033ba4ee914d19;p=users%2Fbernd%2Fpostgres.git Fix core dump in contrib/xml2's xpath_table() when the input query returns a NULL value. Per bug #4058. --- diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c index b02f957777..828545c763 100644 --- a/contrib/xml2/xpath.c +++ b/contrib/xml2/xpath.c @@ -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();