summaryrefslogtreecommitdiff
path: root/libelf/elf32_getshdr.c
diff options
context:
space:
mode:
Diffstat (limited to 'libelf/elf32_getshdr.c')
-rw-r--r--libelf/elf32_getshdr.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/libelf/elf32_getshdr.c b/libelf/elf32_getshdr.c
index c7f75bbb..8d658752 100644
--- a/libelf/elf32_getshdr.c
+++ b/libelf/elf32_getshdr.c
@@ -66,9 +66,11 @@
ElfW2(LIBELFBITS,Shdr) *
-elfw2(LIBELFBITS,getshdr) (scn)
+__elfw2(LIBELFBITS,getshdr_internal) (scn, locked)
Elf_Scn *scn;
+ lockstat_t locked;
{
+ /* XXX: no read locking here, figure out why is it not necessary. */
ElfW2(LIBELFBITS,Shdr) *result;
if (scn == NULL)
@@ -93,7 +95,7 @@ elfw2(LIBELFBITS,getshdr) (scn)
Elf *elf = scn->elf;
ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
- rwlock_wrlock (elf->lock);
+ rwlock_to_wrlock (locked, &elf->lock);
/* Try again, maybe the data is there now. */
result = scn->shdr.ELFW(e,LIBELFBITS);
@@ -101,7 +103,7 @@ elfw2(LIBELFBITS,getshdr) (scn)
goto out;
size_t shnum;
- if (INTUSE (elf_getshnum) (elf, &shnum) != 0)
+ if (__elf_getshnum_internal (elf, &shnum, LS_WRLOCKED) != 0)
goto out;
size_t size = shnum * sizeof (ElfW2(LIBELFBITS,Shdr));
@@ -235,9 +237,15 @@ elfw2(LIBELFBITS,getshdr) (scn)
assert (result != NULL);
out:
- rwlock_unlock (elf->lock);
+ rwlock_from_wrlock (locked, &elf->lock);
}
return result;
}
-INTDEF(elfw2(LIBELFBITS,getshdr))
+
+ElfW2(LIBELFBITS,Shdr) *
+elfw2(LIBELFBITS,getshdr) (scn)
+ Elf_Scn *scn;
+{
+ return __elfw2(LIBELFBITS,getshdr_internal) (scn, LS_UNLOCKED);
+}