From: Heather McIntyre <h...@rice.edu> * libdw/dwarf_hasattr.c (dwarf_hasattr): Use die_abbrev_lock around __libdw_dieabbrev call.
Signed-off-by: Heather S. McIntyre <h...@rice.edu> Signed-off-by: Mark Wielaard <m...@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