[PATCH 11/16] libdw: Add locking around __libdw_dieabbrev for dwarf_hasattr
Mark Wielaard
mark@klomp.org
Tue Oct 10 13:42:55 GMT 2023
From: Heather McIntyre <hsm2@rice.edu>
* libdw/dwarf_hasattr.c (dwarf_hasattr): Use die_abbrev_lock
around __libdw_dieabbrev call.
Signed-off-by: Heather S. McIntyre <hsm2@rice.edu>
Signed-off-by: Mark Wielaard <mark@klomp.org>
---
libdw/dwarf_hasattr.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/libdw/dwarf_hasattr.c b/libdw/dwarf_hasattr.c
index eca08394..92f8de68 100644
--- a/libdw/dwarf_hasattr.c
+++ b/libdw/dwarf_hasattr.c
@@ -34,6 +34,10 @@
#include <dwarf.h>
#include "libdwP.h"
+/* dwarf_hasattr() calls __libdw_dieabbrev() in libdwP.h.
+ __libdw_dieabbrev() reads/writes "die->abbrev".
+ Mutual exclusion is enforced around the call to __libdw_dieabbrev to prevent a race. */
+rwlock_define(static, die_abbrev_lock);
int
dwarf_hasattr (Dwarf_Die *die, unsigned int search_name)
@@ -41,8 +45,13 @@ dwarf_hasattr (Dwarf_Die *die, unsigned int search_name)
if (die == NULL)
return 0;
+ rwlock_wrlock(die_abbrev_lock);
+
/* Find the abbreviation entry. */
Dwarf_Abbrev *abbrevp = __libdw_dieabbrev (die, NULL);
+
+ rwlock_unlock(die_abbrev_lock);
+
if (unlikely (abbrevp == DWARF_END_ABBREV))
{
__libdw_seterrno (DWARF_E_INVALID_DWARF);
--
2.41.0
More information about the Elfutils-devel
mailing list