aboutsummaryrefslogtreecommitdiff
path: root/ld/plugin.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2018-06-05 21:04:00 +0930
committerAlan Modra <amodra@gmail.com>2018-06-05 22:39:11 +0930
commit27b0767593284f97384b3597ebd211164f8c8b47 (patch)
tree1f82c304a2abc2acca2d865190b382e0963cd84a /ld/plugin.c
parent8347745522002d5c0093bac584a2eaf9386ad219 (diff)
downloadfsf-binutils-gdb-27b0767593284f97384b3597ebd211164f8c8b47.zip
fsf-binutils-gdb-27b0767593284f97384b3597ebd211164f8c8b47.tar.gz
fsf-binutils-gdb-27b0767593284f97384b3597ebd211164f8c8b47.tar.bz2
PR23254, ld.bfd mishandles file pointers while scanning archive
Best practice is to not mix lseek/read with fseek/fread on the same underlying file descriptor, as not all stdio implementations will cope. Since the plugin uses lseek/read while bfd uses fseek/fread this patch reopens the file for exclusive use by the plugin rather than trying to restore the file descriptor. That allows the plugin to read the file after plugin_call_claim_file too. bfd/ PR 23254 * plugin.c (bfd_plugin_open_input): Allow for possibility of nested archives. Open file again for plugin. (try_claim): Don't save and restore file position. Close file if not claimed. * sysdep.h (O_BINARY): Define. ld/ PR 23254 * plugin.c (plugin_call_claim_file): Revert 2016-07-19 patch. (plugin_object_p): Don't dup file descriptor.
Diffstat (limited to 'ld/plugin.c')
-rw-r--r--ld/plugin.c10
1 files changed, 0 insertions, 10 deletions
diff --git a/ld/plugin.c b/ld/plugin.c
index fad8bc0..78f2e04 100644
--- a/ld/plugin.c
+++ b/ld/plugin.c
@@ -1053,14 +1053,10 @@ plugin_call_claim_file (const struct ld_plugin_input_file *file, int *claimed)
{
if (curplug->claim_file_handler)
{
- off_t cur_offset;
enum ld_plugin_status rv;
called_plugin = curplug;
- cur_offset = lseek (file->fd, 0, SEEK_CUR);
rv = (*curplug->claim_file_handler) (file, claimed);
- if (!*claimed)
- lseek (file->fd, cur_offset, SEEK_SET);
called_plugin = NULL;
if (rv != LDPS_OK)
set_plugin_error (curplug->name);
@@ -1126,12 +1122,6 @@ plugin_object_p (bfd *ibfd)
}
file.handle = input;
- /* The plugin API expects that the file descriptor won't be closed
- and reused as done by the bfd file cache. So dup one. */
- file.fd = dup (file.fd);
- if (file.fd < 0)
- return NULL;
-
input->abfd = abfd;
input->view_buffer.addr = NULL;
input->view_buffer.filesize = 0;