From 2e0ab7a5e7326a8a15e1f1bc9844686147af6d08 Mon Sep 17 00:00:00 2001 From: Heather McIntyre Date: Tue, 10 Oct 2023 15:42:55 +0200 Subject: [PATCH] libdw: Add locking around __libdw_dieabbrev for dwarf_hasattr * libdw/dwarf_hasattr.c (dwarf_hasattr): Use die_abbrev_lock around __libdw_dieabbrev call. Signed-off-by: Heather S. McIntyre Signed-off-by: Mark Wielaard --- libdw/dwarf_hasattr.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libdw/dwarf_hasattr.c b/libdw/dwarf_hasattr.c index eca08394b..92f8de685 100644 --- a/libdw/dwarf_hasattr.c +++ b/libdw/dwarf_hasattr.c @@ -34,6 +34,10 @@ #include #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.47.3