From: Heather McIntyre Date: Tue, 10 Oct 2023 10:39:53 +0000 (+0200) Subject: libelf: Make elf_version thread-safe X-Git-Tag: elfutils-0.190~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4ecc50a568a8d8b4ddbc924a37d0364b2ae6ba69;p=thirdparty%2Felfutils.git libelf: Make elf_version thread-safe * elf_version.c (version_once): Define once. (initialize_version): New static function. (elf_version): Use initialize_version version_once. Signed-off-by: Heather S. McIntyre Signed-off-by: Mark Wielaard --- diff --git a/libelf/elf_version.c b/libelf/elf_version.c index 6ec534ab1..8296bb657 100644 --- a/libelf/elf_version.c +++ b/libelf/elf_version.c @@ -32,12 +32,21 @@ #endif #include +#include +/* Multiple threads may initialize __libelf_version. + pthread_once() ensures that __libelf_version is initialized only once. */ +once_define(static, version_once); /* Currently selected version. Should be EV_CURRENT. Will be EV_NONE if elf_version () has not been called yet. */ unsigned int __libelf_version = EV_NONE; +static void initialize_version(void) +{ + __libelf_version = EV_CURRENT; +} + unsigned int elf_version (unsigned int version) { @@ -49,7 +58,7 @@ elf_version (unsigned int version) /* Phew, we know this version. */ /* Signal that the version is now initialized. */ - __libelf_version = EV_CURRENT; + once(version_once, initialize_version); /* And return the last (or initial) version. */ return EV_CURRENT;