fix out-of-bounds access in elf.c:find_link
authorSergei Trofimovich <slyfox@gentoo.org>
Sat, 24 Jun 2017 17:40:41 +0000 (18:40 +0100)
committerAlan Modra <amodra@gmail.com>
Sun, 25 Jun 2017 00:59:57 +0000 (10:29 +0930)
The out-of-bounds access is reproducible on 'ia64-strip' command
(see sample from https://bugs.gentoo.org/show_bug.cgi?id=622500)

The output file contains less section than original one.
This tricks 'hint' access to go out-of-bounds:

* elf.c (find_link): Bounds check "hint".

bfd/ChangeLog
bfd/elf.c

index f7ef5e1..945cb68 100644 (file)
@@ -1,3 +1,7 @@
+2017-06-25  Sergei Trofimovich  <slyfox@gentoo.org>
+
+       * elf.c (find_link): Bounds check "hint".
+
 2017-06-24  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * elf32-arm.c (using_thumb_only): Update list of architectures in
index 5f37e7f..76c6a5c 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -1283,7 +1283,8 @@ section_match (const Elf_Internal_Shdr * a,
    to be the correct section.  */
 
 static unsigned int
-find_link (const bfd * obfd, const Elf_Internal_Shdr * iheader, const unsigned int hint)
+find_link (const bfd *obfd, const Elf_Internal_Shdr *iheader,
+          const unsigned int hint)
 {
   Elf_Internal_Shdr ** oheaders = elf_elfsections (obfd);
   unsigned int i;
@@ -1291,7 +1292,8 @@ find_link (const bfd * obfd, const Elf_Internal_Shdr * iheader, const unsigned i
   BFD_ASSERT (iheader != NULL);
 
   /* See PR 20922 for a reproducer of the NULL test.  */
-  if (oheaders[hint] != NULL
+  if (hint < elf_numsections (obfd)
+      && oheaders[hint] != NULL
       && section_match (oheaders[hint], iheader))
     return hint;