From: Heather McIntyre <h...@rice.edu> * libdw/dwarf_getalt.c (dwarf_getalt): Add locking.
Signed-off-by: Heather S. McIntyre <h...@rice.edu> Signed-off-by: Aaron Merey <ame...@redhat.com> Signed-off-by: Mark Wielaard <m...@klomp.org> v2 changes: Write lock now applies to all of dwarf_getalt. --- libdw/dwarf_getalt.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) 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) -- 2.45.2