#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)
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);