diff options
author | Nick Clifton <nickc@redhat.com> | 2018-08-01 14:34:41 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2018-08-01 14:34:41 +0100 |
commit | 103da91bc083f94769e3758175a96d06cef1f8fe (patch) | |
tree | 781c4671d0055eca0dd72af38b23e228d0d70e90 | |
parent | 50320b1d4a1dd06db70aeea485e0ffd9871548e0 (diff) | |
download | gdb-103da91bc083f94769e3758175a96d06cef1f8fe.zip gdb-103da91bc083f94769e3758175a96d06cef1f8fe.tar.gz gdb-103da91bc083f94769e3758175a96d06cef1f8fe.tar.bz2 |
Close resource leaks in the BFD library's plugin handler.
PR 23460
* plugin.c (bfd_plugin_open_input): Close file descriptor if the
call to fstat fails.
(try_claim): Always close the file descriptor at the end of the
function.
(try_load_plugin): If a plugin has already been registered, then
skip the dlopen and onload steps and go straight to claiming the
file. If these is an error, close the plugin.
-rw-r--r-- | bfd/ChangeLog | 11 | ||||
-rw-r--r-- | bfd/plugin.c | 26 |
2 files changed, 30 insertions, 7 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index aebedba..117a8db 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2018-08-01 Zenith <zenith432@users.sourceforge.net> + + PR 23460 + * plugin.c (bfd_plugin_open_input): Close file descriptor if the + call to fstat fails. + (try_claim): Always close the file descriptor at the end of the + function. + (try_load_plugin): If a plugin has already been registered, then + skip the dlopen and onload steps and go straight to claiming the + file. If these is an error, close the plugin. + 2018-08-01 Alan Modra <amodra@gmail.com> * elf64-ppc.c (plt_stub_pad): Delay plt_stub_size call until needed. diff --git a/bfd/plugin.c b/bfd/plugin.c index 7c5bba2..d9b9e2f 100644 --- a/bfd/plugin.c +++ b/bfd/plugin.c @@ -124,7 +124,7 @@ message (int level ATTRIBUTE_UNUSED, } /* Register a claim-file handler. */ -static ld_plugin_claim_file_handler claim_file; +static ld_plugin_claim_file_handler claim_file = NULL; static enum ld_plugin_status register_claim_file (ld_plugin_claim_file_handler handler) @@ -186,8 +186,13 @@ bfd_plugin_open_input (bfd *ibfd, struct ld_plugin_input_file *file) if (iobfd == ibfd) { struct stat stat_buf; + if (fstat (file->fd, &stat_buf)) - return 0; + { + close(file->fd); + return 0; + } + file->offset = 0; file->filesize = stat_buf.st_size; } @@ -208,21 +213,24 @@ try_claim (bfd *abfd) file.handle = abfd; if (!bfd_plugin_open_input (abfd, &file)) return 0; - claim_file (&file, &claimed); - if (!claimed) - close (file.fd); + if (claim_file) + claim_file (&file, &claimed); + close (file.fd); return claimed; } static int try_load_plugin (const char *pname, bfd *abfd, int *has_plugin_p) { - void *plugin_handle; + void *plugin_handle = NULL; struct ld_plugin_tv tv[4]; int i; ld_plugin_onload onload; enum ld_plugin_status status; + if (claim_file) + goto have_claim_file; + *has_plugin_p = 0; plugin_handle = dlopen (pname, RTLD_NOW); @@ -257,6 +265,7 @@ try_load_plugin (const char *pname, bfd *abfd, int *has_plugin_p) if (status != LDPS_OK) goto err; +have_claim_file: *has_plugin_p = 1; abfd->plugin_format = bfd_plugin_no; @@ -272,6 +281,9 @@ try_load_plugin (const char *pname, bfd *abfd, int *has_plugin_p) return 1; err: + if (plugin_handle) + dlclose (plugin_handle); + register_claim_file (NULL); return 0; } @@ -362,7 +374,7 @@ load_plugin (bfd *abfd) int valid_plugin; full_name = concat (p, "/", ent->d_name, NULL); - if (stat(full_name, &s) == 0 && S_ISREG (s.st_mode)) + if (stat (full_name, &s) == 0 && S_ISREG (s.st_mode)) found = try_load_plugin (full_name, abfd, &valid_plugin); if (has_plugin <= 0) has_plugin = valid_plugin; |