The libxml2 error handling gets the filename from a libxml2 struct, but
it is better to not assume libxml2 knows the filename being parsed, as
we might have simply provided it a pre-loaded string.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
src/util/virxml.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/src/util/virxml.c b/src/util/virxml.c
index 91f736bf39..797aa6f6ca 100644
--- a/src/util/virxml.c
+++ b/src/util/virxml.c
@@ -46,6 +46,7 @@
/* Internal data to be passed to SAX parser and used by error handler. */
struct virParserData {
int domcode;
+ const char *filename;
};
@@ -1022,7 +1023,7 @@ static void
catchXMLError(void *ctx, const char *msg G_GNUC_UNUSED, ...)
{
xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
-
+ struct virParserData *private = ctxt->_private;
const xmlChar *cur, *base;
unsigned int n, col; /* GCC warns if signed, because compared with sizeof()
*/
int domcode = VIR_FROM_XML;
@@ -1030,6 +1031,10 @@ catchXMLError(void *ctx, const char *msg G_GNUC_UNUSED, ...)
g_autofree char *contextstr = NULL;
g_autofree char *pointerstr = NULL;
const xmlError *lastError = xmlCtxtGetLastError(ctxt);
+ const char *filename = NULL;
+
+ if (private)
+ filename = private->filename;
/* conditions for error printing */
if (!ctxt ||
@@ -1040,9 +1045,8 @@ catchXMLError(void *ctx, const char *msg G_GNUC_UNUSED, ...)
lastError->message == NULL)
return;
- if (ctxt->_private)
- domcode = ((struct virParserData *) ctxt->_private)->domcode;
-
+ if (private)
+ domcode = private->domcode;
cur = ctxt->input->cur;
base = ctxt->input->base;
@@ -1083,10 +1087,10 @@ catchXMLError(void *ctx, const char *msg G_GNUC_UNUSED, ...)
pointerstr = virBufferContentAndReset(&buf);
- if (lastError->file) {
+ if (filename) {
virGenericReportError(domcode, VIR_ERR_XML_DETAIL,
_("%1$s:%2$d: %3$s%4$s\n%5$s"),
- lastError->file,
+ filename,
lastError->line,
lastError->message,
contextstr,
@@ -1152,6 +1156,7 @@ virXMLParseHelper(int domcode,
abort();
private.domcode = domcode;
+ private.filename = filename;
pctxt->_private = &private;
pctxt->sax->error = catchXMLError;
--
2.46.0