[PATCH 4/9 v2] libdw: make dwarf_getalt thread-safe
Aaron Merey
amerey@redhat.com
Wed Jul 17 22:34:03 GMT 2024
From: Heather McIntyre <hsm2@rice.edu>
* libdw/dwarf_getalt.c (dwarf_getalt): Add locking.
Signed-off-by: Heather S. McIntyre <hsm2@rice.edu>
Signed-off-by: Aaron Merey <amerey@redhat.com>
Signed-off-by: Mark Wielaard <mark@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
More information about the Elfutils-devel
mailing list