aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeather McIntyre <hsm2@rice.edu>2023-10-10 12:39:53 +0200
committerMark Wielaard <mark@klomp.org>2023-10-14 16:49:25 +0200
commit4ecc50a568a8d8b4ddbc924a37d0364b2ae6ba69 (patch)
tree307cf533a25ee1ade60fe38d94bd77738d19e22c
parent6d84c62cebeb2768dcb4a1843d503537d86a153e (diff)
downloadelfutils-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.c11
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;