pg_xml_errctxcheck.patch
application/octet-stream
Filename: pg_xml_errctxcheck.patch
Type: application/octet-stream
Part: 0
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c
index f3db3f0..94ad656 100644
*** a/src/backend/utils/adt/xml.c
--- b/src/backend/utils/adt/xml.c
*************** PgXmlErrorContext *
*** 928,933 ****
--- 928,934 ----
pg_xml_init(PgXmlStrictness strictness)
{
PgXmlErrorContext *errcxt;
+ void *cur_errcxt;
/* Do one-time setup if needed */
pg_xml_init_library();
*************** pg_xml_init(PgXmlStrictness strictness)
*** 956,961 ****
--- 957,991 ----
xmlSetStructuredErrorFunc((void *) errcxt, xml_errorHandler);
+ /*
+ * Verify that we're able to read back the error context we just set.
+ * If this fails, the error context we saved above is probably equally
+ * bogus, and since that leave us without a way to restore the context
+ * in pg_xml_done(), we complain early and loudly. The only known
+ * situation in which we fail this test is if we compile with headers
+ * from a libxml2 which doesn't track the structured error context
+ * separately (<= 2.7.3), but (dynamically) link a version that does.
+ */
+
+ #ifdef HAVE_XMLSTRUCTUREDERRORCONTEXT
+ cur_errcxt = xmlStructuredErrorContext;
+ #else
+ cur_errcxt = xmlGenericErrorContext;
+ #endif
+ if (cur_errcxt != (void *) errcxt)
+ {
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED)
+ ,errmsg("could not setup XML error handler")
+ ,errdetail("libxml2 error context could not be queried")
+ #ifndef HAVE_XMLSTRUCTUREDERRORCONTEXT
+ ,errhint("Postgres was built with a libxml version without "
+ "xmlStructuredErrorContext but is probably now using "
+ "a version with it. This situation is unsupported")
+ #endif
+ ));
+ }
+
return errcxt;
}
*************** xml_errorHandler(void *data, xmlErrorPtr
*** 1494,1502 ****
int level = error->level;
StringInfo errorBuf;
! /* Defend against someone passing us a bogus context struct */
if (xmlerrcxt->magic != ERRCXT_MAGIC)
! elog(ERROR, "xml_errorHandler called with invalid PgXmlErrorContext");
/*----------
* Older libxml versions report some errors differently.
--- 1524,1536 ----
int level = error->level;
StringInfo errorBuf;
! /*
! * Defend against someone passing us a bogus context struct.
! * We force a backend exit if this check fails because longjmp()ing
! * out of libxml might render it unuseable.
! */
if (xmlerrcxt->magic != ERRCXT_MAGIC)
! elog(FATAL, "xml_errorHandler called with invalid PgXmlErrorContext");
/*----------
* Older libxml versions report some errors differently.