diff options
author | Heather McIntyre <hsm2@rice.edu> | 2023-10-10 12:39:53 +0200 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2023-10-14 16:49:25 +0200 |
commit | 4ecc50a568a8d8b4ddbc924a37d0364b2ae6ba69 (patch) | |
tree | 307cf533a25ee1ade60fe38d94bd77738d19e22c | |
parent | 6d84c62cebeb2768dcb4a1843d503537d86a153e (diff) | |
download | elfutils-4ecc50a568a8d8b4ddbc924a37d0364b2ae6ba69.tar.gz |
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 <hsm2@rice.edu>
Signed-off-by: Mark Wielaard <mark@klomp.org>
-rw-r--r-- | libelf/elf_version.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/libelf/elf_version.c b/libelf/elf_version.c index 6ec534ab..8296bb65 100644 --- a/libelf/elf_version.c +++ b/libelf/elf_version.c @@ -32,12 +32,21 @@ #endif #include <libelfP.h> +#include <pthread.h> +/* 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; |