summaryrefslogtreecommitdiff
path: root/libdw/dwarf_formblock.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdw/dwarf_formblock.c')
-rw-r--r--libdw/dwarf_formblock.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/libdw/dwarf_formblock.c b/libdw/dwarf_formblock.c
index 51396d47..c6019b81 100644
--- a/libdw/dwarf_formblock.c
+++ b/libdw/dwarf_formblock.c
@@ -57,13 +57,14 @@
int
-dwarf_formblock (attr, return_block)
+__libdw_formblock_rdlock (attr, return_block)
Dwarf_Attribute *attr;
Dwarf_Block *return_block;
{
if (attr == NULL)
return -1;
+ Dwarf *dbg = attr->cu->dbg;
const unsigned char *datap;
switch (attr->form)
@@ -74,12 +75,12 @@ dwarf_formblock (attr, return_block)
break;
case DW_FORM_block2:
- return_block->length = read_2ubyte_unaligned (attr->cu->dbg, attr->valp);
+ return_block->length = read_2ubyte_unaligned (dbg, attr->valp);
return_block->data = attr->valp + 2;
break;
case DW_FORM_block4:
- return_block->length = read_4ubyte_unaligned (attr->cu->dbg, attr->valp);
+ return_block->length = read_4ubyte_unaligned (dbg, attr->valp);
return_block->data = attr->valp + 4;
break;
@@ -95,8 +96,8 @@ dwarf_formblock (attr, return_block)
}
if (return_block->data + return_block->length
- > ((unsigned char *) attr->cu->dbg->sectiondata[IDX_debug_info]->d_buf
- + attr->cu->dbg->sectiondata[IDX_debug_info]->d_size))
+ > ((unsigned char *) dbg->sectiondata[IDX_debug_info]->d_buf
+ + dbg->sectiondata[IDX_debug_info]->d_size))
{
/* Block does not fit. */
__libdw_seterrno (DWARF_E_INVALID_DWARF);
@@ -105,4 +106,19 @@ dwarf_formblock (attr, return_block)
return 0;
}
+
+int
+dwarf_formblock (attr, return_block)
+ Dwarf_Attribute *attr;
+ Dwarf_Block *return_block;
+{
+ if (attr == NULL)
+ return -1;
+
+ rwlock_rdlock (attr->cu->dbg->lock);
+ int retval = __libdw_formblock_rdlock (attr, return_block);
+ rwlock_unlock (attr->cu->dbg->lock);
+
+ return retval;
+}
INTDEF(dwarf_formblock)