Blame SOURCES/binutils-CVE-2020-35448.patch

d1152b
diff -rup binutils.orig/bfd/elf.c binutils-2.35/bfd/elf.c
d1152b
--- binutils.orig/bfd/elf.c	2021-04-19 10:49:21.757290990 +0100
d1152b
+++ binutils-2.35/bfd/elf.c	2021-04-19 10:50:28.309839285 +0100
d1152b
@@ -12534,7 +12534,9 @@ _bfd_elf_slurp_secondary_reloc_section (
d1152b
       Elf_Internal_Shdr * hdr = & elf_section_data (relsec)->this_hdr;
d1152b
 
d1152b
       if (hdr->sh_type == SHT_SECONDARY_RELOC
d1152b
-	  && hdr->sh_info == (unsigned) elf_section_data (sec)->this_idx)
d1152b
+	  && hdr->sh_info == (unsigned) elf_section_data (sec)->this_idx
d1152b
+	  && (hdr->sh_entsize == ebd->s->sizeof_rel
d1152b
+	      || hdr->sh_entsize == ebd->s->sizeof_rela))
d1152b
 	{
d1152b
 	  bfd_byte * native_relocs;
d1152b
 	  bfd_byte * native_reloc;
d1152b
diff -rup binutils.orig/bfd/elfcode.h binutils-2.35/bfd/elfcode.h
d1152b
--- binutils.orig/bfd/elfcode.h	2021-04-19 10:49:21.767290922 +0100
d1152b
+++ binutils-2.35/bfd/elfcode.h	2021-04-19 10:52:22.196066303 +0100
d1152b
@@ -568,7 +568,7 @@ elf_object_p (bfd *abfd)
d1152b
 
d1152b
   /* If this is a relocatable file and there is no section header
d1152b
      table, then we're hosed.  */
d1152b
-  if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_type == ET_REL)
d1152b
+  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
d1152b
     goto got_wrong_format_error;
d1152b
 
d1152b
   /* As a simple sanity check, verify that what BFD thinks is the
d1152b
@@ -578,7 +578,7 @@ elf_object_p (bfd *abfd)
d1152b
     goto got_wrong_format_error;
d1152b
 
d1152b
   /* Further sanity check.  */
d1152b
-  if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_shnum != 0)
d1152b
+  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
d1152b
     goto got_wrong_format_error;
d1152b
 
d1152b
   ebd = get_elf_backend_data (abfd);
d1152b
@@ -615,7 +615,7 @@ elf_object_p (bfd *abfd)
d1152b
       && ebd->elf_osabi != ELFOSABI_NONE)
d1152b
     goto got_wrong_format_error;
d1152b
 
d1152b
-  if (i_ehdrp->e_shoff != 0)
d1152b
+  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
d1152b
     {
d1152b
       file_ptr where = (file_ptr) i_ehdrp->e_shoff;
d1152b
 
d1152b
@@ -807,7 +807,7 @@ elf_object_p (bfd *abfd)
d1152b
 	}
d1152b
     }
d1152b
 
d1152b
-  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff != 0)
d1152b
+  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
d1152b
     {
d1152b
       unsigned int num_sec;
d1152b