]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util/xml: don't assume libxml2 has the filename of the document
authorDaniel P. Berrangé <berrange@redhat.com>
Fri, 9 Aug 2024 10:30:59 +0000 (11:30 +0100)
committerDaniel P. Berrangé <berrange@redhat.com>
Fri, 20 Dec 2024 10:00:22 +0000 (10:00 +0000)
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 <pkrempa@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/util/virxml.c

index 38baeec5bb00de371d7c72fffacaf6d80de4edf7..521ea28934eb3406e046ea46bc54e6827c46b74e 100644 (file)
@@ -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;