]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
libdw: make dwarf_getalt thread-safe
authorAaron Merey <amerey@redhat.com>
Fri, 12 Jul 2024 22:35:00 +0000 (18:35 -0400)
committerAaron Merey <amerey@redhat.com>
Tue, 16 Jul 2024 20:22:36 +0000 (16:22 -0400)
* 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

index 0a12dfae96772bf49033da744d5db9255aaf3440..3b827d0be2aa0ad3d5622f952c85fe4cc0e7aa08 100644 (file)
@@ -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)