summaryrefslogtreecommitdiffstats
path: root/libelf/elf_begin.c
diff options
context:
space:
mode:
Diffstat (limited to 'libelf/elf_begin.c')
-rw-r--r--libelf/elf_begin.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/libelf/elf_begin.c b/libelf/elf_begin.c
index 213b5c0b..f26119c2 100644
--- a/libelf/elf_begin.c
+++ b/libelf/elf_begin.c
@@ -1039,6 +1039,19 @@ write_file (int fd, Elf_Cmd cmd)
return result;
}
+/* Lock if necessary before dup an archive. */
+static inline Elf *
+lock_dup_elf (int fildes, Elf_Cmd cmd, Elf *ref)
+{
+ /* We need wrlock to dup an archive. */
+ if (ref->kind == ELF_K_AR)
+ {
+ rwlock_unlock (ref->lock);
+ rwlock_wrlock (ref->lock);
+ }
+ /* Duplicate the descriptor. */
+ return dup_elf (fildes, cmd, ref);
+}
/* Return a descriptor for the file belonging to FILDES. */
Elf *
@@ -1063,19 +1076,6 @@ elf_begin (int fildes, Elf_Cmd cmd, Elf *ref)
return NULL;
}
- Elf *lock_dup_elf (void)
- {
- /* We need wrlock to dup an archive. */
- if (ref->kind == ELF_K_AR)
- {
- rwlock_unlock (ref->lock);
- rwlock_wrlock (ref->lock);
- }
-
- /* Duplicate the descriptor. */
- return dup_elf (fildes, cmd, ref);
- }
-
switch (cmd)
{
case ELF_C_NULL:
@@ -1096,7 +1096,7 @@ elf_begin (int fildes, Elf_Cmd cmd, Elf *ref)
case ELF_C_READ:
case ELF_C_READ_MMAP:
if (ref != NULL)
- retval = lock_dup_elf ();
+ retval = lock_dup_elf (fildes, cmd, ref);
else
/* Create descriptor for existing file. */
retval = read_file (fildes, 0, ~((size_t) 0), cmd, NULL);
@@ -1117,7 +1117,7 @@ elf_begin (int fildes, Elf_Cmd cmd, Elf *ref)
retval = NULL;
}
else
- retval = lock_dup_elf ();
+ retval = lock_dup_elf (fildes, cmd, ref);
}
else
/* Create descriptor for existing file. */