Some time ago John Gray <jgray@azuli.co.uk> and myself worked out and

tested a patch to contrib/xml where the existing code was causing
postgres to crash when it encountered & entities in the XML. I've
enclosed a patch that John came up with to correct this problem. It
patches against 7.3 and will apply on 7.2x if the elog WARNING calls
are changed to elog NOTICE.

Michael Richards
WIN32_DEV
Bruce Momjian 23 years ago
parent 5b4c16e099
commit 87cba401a4
  1. 11
      contrib/xml/pgxml_dom.c

@ -87,10 +87,10 @@ pgxml_parse(PG_FUNCTION_ARGS)
doctree = xmlParseMemory((char *) VARDATA(t), docsize); doctree = xmlParseMemory((char *) VARDATA(t), docsize);
if (doctree == NULL) if (doctree == NULL)
{ {
/* xmlCleanupParser(); */ xmlCleanupParser();
PG_RETURN_BOOL(false); /* i.e. not well-formed */ PG_RETURN_BOOL(false); /* i.e. not well-formed */
} }
/* xmlCleanupParser(); */ xmlCleanupParser();
xmlFreeDoc(doctree); xmlFreeDoc(doctree);
PG_RETURN_BOOL(true); PG_RETURN_BOOL(true);
} }
@ -202,7 +202,8 @@ pgxml_xpath(PG_FUNCTION_ARGS)
doctree = xmlParseMemory((char *) VARDATA(t), docsize); doctree = xmlParseMemory((char *) VARDATA(t), docsize);
if (doctree == NULL) if (doctree == NULL)
{ /* not well-formed */ { /* not well-formed */
xmlCleanupParser();
PG_RETURN_NULL(); PG_RETURN_NULL();
} }
@ -216,6 +217,7 @@ pgxml_xpath(PG_FUNCTION_ARGS)
elog(WARNING, "XPath syntax error"); elog(WARNING, "XPath syntax error");
xmlFreeDoc(doctree); xmlFreeDoc(doctree);
pfree((void *) xpath); pfree((void *) xpath);
xmlCleanupParser();
PG_RETURN_NULL(); PG_RETURN_NULL();
} }
@ -227,6 +229,7 @@ pgxml_xpath(PG_FUNCTION_ARGS)
{ {
xmlFreeDoc(doctree); xmlFreeDoc(doctree);
pfree((void *) xpath); pfree((void *) xpath);
xmlCleanupParser();
PG_RETURN_NULL(); /* seems appropriate */ PG_RETURN_NULL(); /* seems appropriate */
} }
/* now we dump this node, ?surrounding by tags? */ /* now we dump this node, ?surrounding by tags? */
@ -257,6 +260,6 @@ pgxml_xpath(PG_FUNCTION_ARGS)
xmlFreeDoc(doctree); xmlFreeDoc(doctree);
pfree((void *) xpath); pfree((void *) xpath);
xmlFree(xpresstr); xmlFree(xpresstr);
xmlCleanupParser();
PG_RETURN_TEXT_P(xpres); PG_RETURN_TEXT_P(xpres);
} }

Loading…
Cancel
Save