]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util/xml: open XML files before calling libxml2
authorDaniel P. Berrangé <berrange@redhat.com>
Wed, 7 Aug 2024 14:54:53 +0000 (15:54 +0100)
committerDaniel P. Berrangé <berrange@redhat.com>
Fri, 20 Dec 2024 10:00:22 +0000 (10:00 +0000)
Libxml2 has awful error reporting behaviour when reading files. When
we fail to load a file from the test driver we see:

  $ virsh -c test:///wibble.xml
  I/O warning : failed to load external entity "/wibble.xml"
  error: failed to connect to the hypervisor
  error: XML error: failed to parse xml document '/wibble.xml'

where the I/O warning line is something printed by libxml2 itself,
which also lacks any useful detail.

Switching to our own file reading code we can massively improve
things:

  $ ./build/tools/virsh -c test:///wibble.xml
  error: failed to connect to the hypervisor
  error: Failed to open file '/wibble.xml': No such file or directory

Using 10 MB as an upper limit on XML file size ought to be sufficient
for any XML files libvirt is reading.

Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/util/virxml.c
tests/qemuxmlconfdata/nonexistent-file.x86_64-latest.err

index 521ea28934eb3406e046ea46bc54e6827c46b74e..670cace4abfa1c8f0502cd86be02787c382f8aef 100644 (file)
@@ -1143,6 +1143,7 @@ virXMLParseHelper(int domcode,
     xmlNodePtr rootnode;
     const char *docname;
     int parseFlags = XML_PARSE_NONET | XML_PARSE_NOWARNING;
+    g_autofree char *xmlStrPtr = NULL;
 
     if (filename)
         docname = filename;
@@ -1166,10 +1167,11 @@ virXMLParseHelper(int domcode,
     }
 
     if (filename) {
-        xml = xmlCtxtReadFile(pctxt, filename, NULL, parseFlags);
-    } else {
-        xml = xmlCtxtReadDoc(pctxt, BAD_CAST xmlStr, url, NULL, parseFlags);
+        if (virFileReadAll(filename, 1024*1024*10, &xmlStrPtr) < 0)
+            return NULL;
+        xmlStr = xmlStrPtr;
     }
+    xml = xmlCtxtReadDoc(pctxt, BAD_CAST xmlStr, url, NULL, parseFlags);
 
     if (!xml) {
         if (virGetLastErrorCode() == VIR_ERR_OK) {
index 0ddf1ea51057752513a32c5e2d87034e29742533..2aedf3ededbb3124474bff9ae47b8b31b5f939ed 100644 (file)
@@ -1 +1 @@
-XML error: failed to parse xml document 'ABS_SRCDIR/qemuxmlconfdata/nonexistent-file.xml'
+Failed to open file 'ABS_SRCDIR/qemuxmlconfdata/nonexistent-file.xml': No such file or directory