From: Daniel P. Berrangé Date: Fri, 9 Aug 2024 10:30:59 +0000 (+0100) Subject: util/xml: don't assume libxml2 has the filename of the document X-Git-Tag: v11.0.0-rc1~50 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7f2fd38ee7b8da8993b427ca6f9bdd29155d455e;p=thirdparty%2Flibvirt.git util/xml: don't assume libxml2 has the filename of the document 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. Reviewed-by: Peter Krempa Reviewed-by: Richard W.M. Jones Signed-off-by: Daniel P. Berrangé --- diff --git a/src/util/virxml.c b/src/util/virxml.c index 38baeec5bb..521ea28934 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; @@ -1084,10 +1088,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, @@ -1153,6 +1157,7 @@ virXMLParseHelper(int domcode, abort(); private.domcode = domcode; + private.filename = filename; pctxt->_private = &private; pctxt->sax->error = catchXMLError;