From: Nick Clifton Date: Wed, 1 Aug 2018 13:34:41 +0000 (+0100) Subject: Close resource leaks in the BFD library's plugin handler. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=103da91bc083f94769e3758175a96d06cef1f8fe;p=binutils-gdb.git 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index aebedbaa23b..117a8dbdcac 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2018-08-01 Zenith + + 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 * elf64-ppc.c (plt_stub_pad): Delay plt_stub_size call until needed. diff --git a/bfd/plugin.c b/bfd/plugin.c index 7c5bba22c70..d9b9e2f174e 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;