On Tue, Nov 11, 2025 at 09:35:59 +0100, Michal Prívozník wrote:
> On 11/10/25 17:20, Peter Krempa via Devel wrote:
> > From: Peter Krempa <[email protected]>
> > 
> > 'libxml2' deprecated the 'xmlIndentTreeOutput' thread-local variable as
> > well as the 'xmlThrDefIndentTreeOutput' function for setting the global
> > default, which we use in our code for formatting the metadata sub-XML.
> > 
> > 'libxml2' also for now doesn't provide a way to set target indentation
> > level in 'xmlSaveCtxt' which would allow us to use the modern output
> > APIs, we can't replace our use of 'xmlDumpNode'.
> 
> Here, I'd like a reference to:
> 
> https://gitlab.gnome.org/GNOME/libxml2/-/issues/989

 I'll add:

  (See https://gitlab.gnome.org/GNOME/libxml2/-/issues/989)

on the next line.
> > 
> > Since the indentation is enabled by default in libxml2 and most of our
> > code using xmlDumpNode (notably except for the 'test' driver and
> > embedded qemu driver uses) is in standalone processes, which didn't
> > change the default, just removing the override will result in identical
> > behaviour.
> 
> I think there are more drivers like that: ESX, VMWare, hyperv and maybe
> others.
> 
> > 
> > For the two exeptions, the result of changing the default would be that
> 
> exceptions

How about avoiding the issue by not naming anything:

Since the indentation is enabled by default in libxml2 and our most
commonly used code which calls xmlDumpNode lives in a standalone
process, where we don't override the setting, just removing the
override will result in identical behaviour.

For the use cases which do live in a process we don't fully control and
thus the default could have been overriden, the result would be that
the <metadata> element would be un-indented, but that is still valid XML.

> Agreed. Once the aforementioned issue is fixed this can be switched to
> xmlSaveTree().
> 
> > 
> > Thus to fix the deprecated use just stop setting 'xmlIndentTreeOutput'.
> > 
> > Closes: https://gitlab.com/libvirt/libvirt/-/issues/816
> > Signed-off-by: Peter Krempa <[email protected]>
> > ---
> >  src/util/virxml.c | 10 ----------
> >  1 file changed, 10 deletions(-)
> > 
> > diff --git a/src/util/virxml.c b/src/util/virxml.c
> > index 44f11accf3..77c7b5a8f4 100644
> > --- a/src/util/virxml.c
> > +++ b/src/util/virxml.c
> > @@ -1920,23 +1920,14 @@ virXMLFormatMetadata(virBuffer *buf,
> >  {
> >      g_autoptr(xmlBuffer) xmlbuf = NULL;
> >      const char *xmlbufContent = NULL;
> > -    int oldIndentTreeOutput = xmlIndentTreeOutput;
> > 
> >      if (!metadata)
> >          return 0;
> > 
> > -    /* Indentation on output requires that we previously set
> > -     * xmlKeepBlanksDefault to 0 when parsing; also, libxml does 2
> > -     * spaces per level of indentation of intermediate elements,
> > -     * but no leading indentation before the starting element.
> > -     * Thankfully, libxml maps what looks like globals into
> > -     * thread-local uses, so we are thread-safe.  */
> > -    xmlIndentTreeOutput = 1;
> >      xmlbuf = virXMLBufferCreate();
> > 
> >      if (xmlNodeDump(xmlbuf, metadata->doc, metadata,
> >                      virBufferGetIndent(buf) / 2, 1) < 0) {
> > -        xmlIndentTreeOutput = oldIndentTreeOutput;
> >          virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> >                         _("Unable to format metadata element"));
> >          return -1;
> > @@ -1948,7 +1939,6 @@ virXMLFormatMetadata(virBuffer *buf,
> >      virSkipSpaces(&xmlbufContent);
> > 
> >      virBufferAsprintf(buf, "%s\n", xmlbufContent);
> > -    xmlIndentTreeOutput = oldIndentTreeOutput;
> > 
> >      return 0;
> >  }
> 
> 
> Michal
> 

Reply via email to