Re: [PATCH v2 3/3] util/xml: open XML files before calling libxml2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Oct 22, 2024 at 10:33:43AM +0100, Richard W.M. Jones wrote:
> On Tue, Oct 22, 2024 at 10:27:54AM +0100, Daniel P. Berrangé wrote:
> > 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.
> > 
> > Signed-off-by: Daniel P. Berrangé <berrange@xxxxxxxxxx>
> > ---
> >  src/util/virxml.c                                        | 8 +++++---
> >  tests/qemuxmlconfdata/nonexistent-file.x86_64-latest.err | 2 +-
> >  2 files changed, 6 insertions(+), 4 deletions(-)
> > 
> > diff --git a/src/util/virxml.c b/src/util/virxml.c
> > index 797aa6f6ca..deed258bb0 100644
> > --- a/src/util/virxml.c
> > +++ b/src/util/virxml.c
> > @@ -1142,6 +1142,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;
> > @@ -1165,10 +1166,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) {
> > diff --git a/tests/qemuxmlconfdata/nonexistent-file.x86_64-latest.err b/tests/qemuxmlconfdata/nonexistent-file.x86_64-latest.err
> > index 0ddf1ea510..2aedf3eded 100644
> > --- a/tests/qemuxmlconfdata/nonexistent-file.x86_64-latest.err
> > +++ b/tests/qemuxmlconfdata/nonexistent-file.x86_64-latest.err
> > @@ -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
> 
> I know it doesn't matter as the file is literally not there, but isn't
> that supposed to be @ABS_SRCDIR@ or similar?

No, for some reason in our test code we replace the literal
string "ABS_SRCDIR" without the common markers. I guess it
was unique enough, in practice, for tests.

> Anyway the series looks good, so:
> 
> Reviewed-by: Richard W.M. Jones <rjones@xxxxxxxxxx>
> 
> I can't remember which (of probably many) bugs this relates to, but
> maybe one should be mentioned in the commit.

It was something that libguestfs hit back in august IIRC but I couldn't
find the details.

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux