[packages/binutils] - rel 2; Close resource leaks in the BFD library's plugin handler. https://sourceware.org/bugzilla/s

bszx bszx at pld-linux.org
Sat Aug 4 09:54:36 CEST 2018


commit fe3779520a3698ac51c47fe7f4da7583a98d3b56
Author: Bartek Szady <bszx at bszx.eu>
Date:   Sat Aug 4 09:44:43 2018 +0200

    - rel 2; Close resource leaks in the BFD library's plugin handler. https://sourceware.org/bugzilla/show_bug.cgi?id=23460

 binutils.spec |   4 +-
 fd-leak.patch | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 121 insertions(+), 1 deletion(-)
---
diff --git a/binutils.spec b/binutils.spec
index 1a8273c..01dc57d 100644
--- a/binutils.spec
+++ b/binutils.spec
@@ -24,7 +24,7 @@ Summary(tr.UTF-8):	GNU geliştirme araçları
 Summary(uk.UTF-8):	Набір інструментів GNU для побудови виконуваних програм
 Name:		binutils
 Version:	2.31.1
-Release:	1
+Release:	2
 Epoch:		4
 License:	GPL v3+
 Group:		Development/Tools
@@ -45,6 +45,7 @@ Patch9:		%{name}-tooldir.patch
 Patch10:	%{name}-sanity-check.patch
 # https://bugzilla.redhat.com/show_bug.cgi?id=1599521
 Patch11:	binutils-do-not-provide-shared-section-symbols.patch
+Patch12:	fd-leak.patch
 URL:		http://sources.redhat.com/binutils/
 BuildRequires:	autoconf >= 2.64
 BuildRequires:	automake >= 1:1.11
@@ -174,6 +175,7 @@ niektórych pakietów.
 %patch9 -p1
 %patch10 -p1
 %patch11 -p1
+%patch12 -p1
 
 # file contains hacks for ac 2.59 only
 %{__rm} config/override.m4
diff --git a/fd-leak.patch b/fd-leak.patch
new file mode 100644
index 0000000..6a89bac
--- /dev/null
+++ b/fd-leak.patch
@@ -0,0 +1,118 @@
+commit b339543c6cac043f087b51fd859186e77f757f85
+Author: Nick Clifton <nickc at redhat.com>
+Date:   Wed Aug 1 14:34:41 2018 +0100
+
+    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 d3831b7a65..457c00e6bd 100644
+--- a/bfd/ChangeLog
++++ b/bfd/ChangeLog
+@@ -1,3 +1,14 @@
++2018-08-01  Zenith  <zenith432 at 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-07-18  Nick Clifton  <nickc at redhat.com>
+ 
+ 	2.31.1 Release point.
+diff --git a/bfd/plugin.c b/bfd/plugin.c
+index 7c5bba22c7..d9b9e2f174 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;
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/binutils.git/commitdiff/fe3779520a3698ac51c47fe7f4da7583a98d3b56



More information about the pld-cvs-commit mailing list