From: Aaron Merey Date: Fri, 12 Jul 2024 22:35:00 +0000 (-0400) Subject: libdw: make dwarf_getalt thread-safe X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=96fce7b66834304b9fc10658c66935ab83fec134;p=thirdparty%2Felfutils.git libdw: make dwarf_getalt thread-safe * libdw/dwarf_getalt.c (dwarf_getalt): Add locking. Signed-off-by: Heather S. McIntyre Signed-off-by: Aaron Merey Signed-off-by: Mark Wielaard v2 changes: Write lock now applies to all of dwarf_getalt. --- diff --git a/libdw/dwarf_getalt.c b/libdw/dwarf_getalt.c index 0a12dfae..3b827d0b 100644 --- a/libdw/dwarf_getalt.c +++ b/libdw/dwarf_getalt.c @@ -160,15 +160,27 @@ find_debug_altlink (Dwarf *dbg) } } +/* find_debug_altlink() modifies "dbg->alt_dwarf". + dwarf_getalt() reads "main->alt_dwarf". + Mutual exclusion is enforced to prevent a race. */ + Dwarf * dwarf_getalt (Dwarf *main) { + rwlock_wrlock(main->dwarf_lock); + /* Only try once. */ if (main == NULL || main->alt_dwarf == (void *) -1) - return NULL; + { + rwlock_unlock (main->dwarf_lock); + return NULL; + } if (main->alt_dwarf != NULL) - return main->alt_dwarf; + { + rwlock_unlock (main->dwarf_lock); + return main->alt_dwarf; + } find_debug_altlink (main); @@ -176,9 +188,11 @@ dwarf_getalt (Dwarf *main) if (main->alt_dwarf == NULL) { main->alt_dwarf = (void *) -1; + rwlock_unlock (main->dwarf_lock); return NULL; } + rwlock_unlock (main->dwarf_lock); return main->alt_dwarf; } INTDEF (dwarf_getalt)