diff options
Diffstat (limited to 'libelf/elf_begin.c')
-rw-r--r-- | libelf/elf_begin.c | 30 |
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. */ |