[binutils] Import patch from mainline to fix seg-fault when reading corrupt group headers. Resolves: BZ #115727

Nicholas Clifton nickc at fedoraproject.org
Mon Oct 27 13:25:57 UTC 2014


commit b57b4a1e9bfc4316cc58edee7d6f11ab47f49907
Author: Nick Clifton <nickc at redhat.com>
Date:   Mon Oct 27 13:01:52 2014 +0000

    Import patch from mainline to fix seg-fault when reading corrupt group headers.
    Resolves: BZ #1157276, #11527277

 binutils-2.24-corrupt-groups.patch |   86 ++++++++++++++++++++++++++++++++++++
 binutils.spec                      |    8 +++-
 2 files changed, 93 insertions(+), 1 deletions(-)
---
diff --git a/binutils-2.24-corrupt-groups.patch b/binutils-2.24-corrupt-groups.patch
new file mode 100644
index 0000000..b0637f3
--- /dev/null
+++ b/binutils-2.24-corrupt-groups.patch
@@ -0,0 +1,86 @@
+*** ../binutils-2.24.orig/bfd/elf.c	2014-10-27 12:47:20.989181791 +0000
+--- bfd/elf.c	2014-10-27 12:47:33.296248170 +0000
+*************** setup_group (bfd *abfd, Elf_Internal_Shd
+*** 608,616 ****
+  		  if (shdr->contents == NULL)
+  		    {
+  		      _bfd_error_handler
+! 			(_("%B: Corrupt size field in group section header: 0x%lx"), abfd, shdr->sh_size);
+  		      bfd_set_error (bfd_error_bad_value);
+! 		      return FALSE;
+  		    }
+  
+  		  memset (shdr->contents, 0, amt);
+--- 608,617 ----
+  		  if (shdr->contents == NULL)
+  		    {
+  		      _bfd_error_handler
+! 			(_("%B: corrupt size field in group section header: 0x%lx"), abfd, shdr->sh_size);
+  		      bfd_set_error (bfd_error_bad_value);
+! 		      -- num_group;
+! 		      continue;
+  		    }
+  
+  		  memset (shdr->contents, 0, amt);
+*************** setup_group (bfd *abfd, Elf_Internal_Shd
+*** 618,625 ****
+  		  if (bfd_seek (abfd, shdr->sh_offset, SEEK_SET) != 0
+  		      || (bfd_bread (shdr->contents, shdr->sh_size, abfd)
+  			  != shdr->sh_size))
+! 		    return FALSE;
+! 
+  		  /* Translate raw contents, a flag word followed by an
+  		     array of elf section indices all in target byte order,
+  		     to the flag word followed by an array of elf section
+--- 619,635 ----
+  		  if (bfd_seek (abfd, shdr->sh_offset, SEEK_SET) != 0
+  		      || (bfd_bread (shdr->contents, shdr->sh_size, abfd)
+  			  != shdr->sh_size))
+! 		    {
+! 		      _bfd_error_handler
+! 			(_("%B: invalid size field in group section header: 0x%lx"), abfd, shdr->sh_size);
+! 		      bfd_set_error (bfd_error_bad_value);
+! 		      -- num_group;
+! 		      /* PR 17510: If the group contents are even partially
+! 			 corrupt, do not allow any of the contents to be used.  */
+! 		      memset (shdr->contents, 0, amt);
+! 		      continue;
+! 		    }
+! 		  
+  		  /* Translate raw contents, a flag word followed by an
+  		     array of elf section indices all in target byte order,
+  		     to the flag word followed by an array of elf section
+*************** setup_group (bfd *abfd, Elf_Internal_Shd
+*** 651,656 ****
+--- 661,681 ----
+  		    }
+  		}
+  	    }
++ 
++ 	  /* PR 17510: Corrupt binaries might contain invalid groups.  */
++ 	  if (num_group != (unsigned) elf_tdata (abfd)->num_group)
++ 	    {
++ 	      elf_tdata (abfd)->num_group = num_group;
++ 
++ 	      /* If all groups are invalid then fail.  */
++ 	      if (num_group == 0)
++ 		{
++ 		  elf_tdata (abfd)->group_sect_ptr = NULL;
++ 		  elf_tdata (abfd)->num_group = num_group = -1;
++ 		  (*_bfd_error_handler) (_("%B: no valid group sections found"), abfd);
++ 		  bfd_set_error (bfd_error_bad_value);
++ 		}
++ 	    }
+  	}
+      }
+  
+*************** setup_group (bfd *abfd, Elf_Internal_Shd
+*** 716,721 ****
+--- 741,747 ----
+      {
+        (*_bfd_error_handler) (_("%B: no group info for section %A"),
+  			     abfd, newsect);
++       return FALSE;
+      }
+    return TRUE;
+  }
diff --git a/binutils.spec b/binutils.spec
index d8f7093..15d1018 100644
--- a/binutils.spec
+++ b/binutils.spec
@@ -19,7 +19,7 @@
 Summary: A GNU collection of binary utilities
 Name: %{?cross}binutils%{?_with_debug:-debug}
 Version: 2.24
-Release: 24%{?dist}
+Release: 25%{?dist}
 License: GPLv3+
 Group: Development/Tools
 URL: http://sources.redhat.com/binutils
@@ -73,6 +73,7 @@ Patch28: binutils-2.24-aarch64-fix-static-ifunc.patch
 Patch29: binutils-2.24-aarch64-fix-ie-relax.patch
 Patch30: binutils-HEAD-change-ld-notice-interface.patch
 Patch31: binutils-2.24-corrupt-srec.patch
+Patch32: binutils-2.24-corrupt-groups.patch
 
 Provides: bundled(libiberty)
 
@@ -208,6 +209,7 @@ using libelf instead of BFD.
 %patch29 -p1 -b .aa64-3~
 %patch30 -p1 -b .ldplugin~
 %patch31 -p0 -b .srec~
+%patch32 -p0 -b .groups~
 
 # We cannot run autotools as there is an exact requirement of autoconf-2.59.
 
@@ -522,6 +524,10 @@ exit 0
 %endif # %{isnative}
 
 %changelog
+* Mon Oct 27 2014 Nick Clifton <nickc at redhat.com> - 2.24-25
+- Import patch from mainline to fix seg-fault when reading corrupt group headers.
+  Resolves: BZ #1157276
+
 * Fri Oct 24 2014 Nick Clifton <nickc at redhat.com> - 2.24-24
 - Import patch from mainline to fix seg-fault when reading corrupt srec fields.
   Resolves: BZ #1156272


More information about the scm-commits mailing list