PR22746, crash when running 32-bit objdump on corrupted file
authorAlan Modra <amodra@gmail.com>
Thu, 25 Jan 2018 11:17:41 +0000 (21:47 +1030)
committerAlan Modra <amodra@gmail.com>
Thu, 25 Jan 2018 11:35:10 +0000 (22:05 +1030)
Avoid unsigned int overflow by performing bfd_size_type multiplication.

PR 22746
* elfcode.h (elf_object_p): Avoid integer overflow.

bfd/ChangeLog
bfd/elfcode.h

index ba9074e..ba377ab 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-25  Alan Modra  <amodra@gmail.com>
+
+       PR 22746
+       * elfcode.h (elf_object_p): Avoid integer overflow.
+
 2018-01-25  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR ld/22727
index 00a9001..ea1388d 100644 (file)
@@ -680,7 +680,7 @@ elf_object_p (bfd *abfd)
       if (i_ehdrp->e_shnum > ((bfd_size_type) -1) / sizeof (*i_shdrp))
        goto got_wrong_format_error;
 #endif
-      amt = sizeof (*i_shdrp) * i_ehdrp->e_shnum;
+      amt = sizeof (*i_shdrp) * (bfd_size_type) i_ehdrp->e_shnum;
       i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
       if (!i_shdrp)
        goto got_no_match;
@@ -776,7 +776,7 @@ elf_object_p (bfd *abfd)
       if (i_ehdrp->e_phnum > ((bfd_size_type) -1) / sizeof (*i_phdr))
        goto got_wrong_format_error;
 #endif
-      amt = i_ehdrp->e_phnum * sizeof (*i_phdr);
+      amt = (bfd_size_type) i_ehdrp->e_phnum * sizeof (*i_phdr);
       elf_tdata (abfd)->phdr = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
       if (elf_tdata (abfd)->phdr == NULL)
        goto got_no_match;