1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-12-02 12:24:29 +03:00

virXMLFormatMetadata: Don't modify deprecated 'xmlIndentTreeOutput'

'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'. (See
https://gitlab.gnome.org/GNOME/libxml2/-/issues/989 )

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.

Thus to fix the deprecated use just stop setting 'xmlIndentTreeOutput'.

Closes: https://gitlab.com/libvirt/libvirt/-/issues/816
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
Peter Krempa
2025-11-10 16:52:45 +01:00
parent f307c7dc0c
commit 05baaddb3f

View File

@@ -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;
}