On Mon, Jun 23, 2025 at 01:16:01PM +0200, Peter Krempa wrote:
On Mon, Jun 23, 2025 at 12:02:31 +0100, Daniel P. Berrangé via Devel
wrote:
> From: Daniel P. Berrangé <berrange(a)redhat.com>
>
> The main XML parser code global initializer historically had a mutex
> protecting it, and more recently uses a pthread_once. The RelaxNG
> code, however, relies on three other global initializers that are
> not thread safe, just relying on setting an integer "initialized"
> flag.
>
> Calling the relevant initializers from libvirt in a protected global
> initializer will protect libvirt's own concurrent usage, however, it
> cannot protect against other libraries loaded in process that might
> be using libxml2's schema code. Fortunately:
>
> * The chances of other loaded non-libvirt code using libxml is
> relatively low
> * The chances of other loaded non-libvirt code using the schema
> validation / catalog functionality inside libxml is even
> lower
> * The chances of both libvirt and the non-libvirt usage having
> their *1st* usage of libxml2 be concurrent is tiny
Additionaly IIUC this could be problem only when using the embedded
driver mode as we don't use libxml2 in the exported API
Actually we can trigger the problem easily via the public libvirt API
both locally (using test:///default) and remotely (using qemu:///system),
just by using VIR_DOMAIN_DEFINE_VALIDATE concurrently. See the test
program in the bug report:
https://gitlab.com/-/project/192693/uploads/72900e26116909000d926de4db7e6...
It is unlikely something else loaded by libvirtd uses libxml2, but never
say never, as we link to loads of libraries indirectly.
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 :|