readelf: Fix overlarge memory allocation when reading a binary with an excessive...
authorNick Clifton <nickc@redhat.com>
Mon, 3 Apr 2017 11:14:06 +0000 (12:14 +0100)
committerNick Clifton <nickc@redhat.com>
Mon, 3 Apr 2017 11:14:06 +0000 (12:14 +0100)
PR binutils/21345
* readelf.c (get_program_headers): Check for there being too many
program headers before attempting to allocate space for them.

binutils/ChangeLog
binutils/readelf.c

index 438ea7fcd1632d68ca8ff92490b52c59f4a01e17..5d81b353b0db2ffe9a4ea646662c2e4d5d4f8768 100644 (file)
@@ -1,3 +1,9 @@
+2017-04-03  Nick Clifton  <nickc@redhat.com>
+
+       PR binutils/21345
+       * readelf.c (get_program_headers): Check for there being too many
+       program headers before attempting to allocate space for them.
+
 2017-04-03  Nick Clifton  <nickc@redhat.com>
 
        PR binutils/21344
index 3665221501c63944c7f9cf5b83a1ed811e29081b..b573921c13819133ca15a056dbbc6aaf24c28049 100644 (file)
@@ -4794,9 +4794,19 @@ get_program_headers (FILE * file)
   if (program_headers != NULL)
     return TRUE;
 
-  phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
-                                         sizeof (Elf_Internal_Phdr));
+  /* Be kind to memory checkers by looking for
+     e_phnum values which we know must be invalid.  */
+  if (elf_header.e_phnum
+      * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
+      >= current_file_size)
+    {
+      error (_("Too many program headers - %#x - the file is not that big\n"),
+            elf_header.e_phnum);
+      return FALSE;
+    }
 
+  phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
+                                        sizeof (Elf_Internal_Phdr));
   if (phdrs == NULL)
     {
       error (_("Out of memory reading %u program headers\n"),
@@ -15470,7 +15480,8 @@ process_mips_specific (FILE * file)
          /* PR 21344 */
          if (data + ent - pltgot > data_end - addr_size)
            {
-             error (_("Invalid got entry - %#lx - overflows GOT table\n"), ent);
+             error (_("Invalid got entry - %#lx - overflows GOT table\n"),
+                    (long) ent);
              goto got_print_fail;
            }