mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 04:25:18 +00:00
virGlobalInit: Make glib init its own global state
This should not be needed, but here's what's happening: virStrToLong_*() family of functions was switched from strtol*() to g_ascii_strtol*() in order to handle corner cases on Windows (most notably parsing hex numbers with base=0) - see v9.4.0-61-g2ed41d7cd9. But what we did not realize back then, is the fact that g_ascii_strtol*() family has their own global lock rendering virStrToLong_*() function unsafe between fork() + exec(). Worse, if one of the threads has to wait for the lock (or on its corresponding condition), then errno is mangled and g_ascii_strtol*() signals an error, even though there's no error. Read more here: https://gitlab.gnome.org/GNOME/glib/-/issues/3034 Nevertheless, if we make glib init the g_ascii_strtol*() global state (by calling one function from g_ascii_strtol*() family), then there shouldn't be any congestion on the lock and thus no errno mangling. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
a5bf2c4bf9
commit
1dddd44451
@ -214,6 +214,14 @@ virGlobalInit(void)
|
||||
if (virErrorInitialize() < 0)
|
||||
goto error;
|
||||
|
||||
/* Make glib initialize its own global state. See more:
|
||||
*
|
||||
* https://gitlab.gnome.org/GNOME/glib/-/issues/3034
|
||||
*
|
||||
* TODO: Remove ASAP.
|
||||
*/
|
||||
g_ascii_strtoull("0", NULL, 0);
|
||||
|
||||
virFileActivateDirOverrideForLib();
|
||||
|
||||
if (getuid() != geteuid() ||
|
||||
|
Loading…
x
Reference in New Issue
Block a user