From 4ecc50a568a8d8b4ddbc924a37d0364b2ae6ba69 Mon Sep 17 00:00:00 2001 From: Heather McIntyre Date: Tue, 10 Oct 2023 12:39:53 +0200 Subject: [PATCH] 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 --- libelf/elf_version.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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; -- 2.47.2