From 27b0767593284f97384b3597ebd211164f8c8b47 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 5 Jun 2018 21:04:00 +0930 Subject: 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. --- ld/plugin.c | 10 ---------- 1 file changed, 10 deletions(-) (limited to 'ld/plugin.c') 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; -- cgit v1.1