Fix a seg-fault in strings and other binutuils when parsing a corrupt PE
authorNick Clifton <nickc@redhat.com>
Mon, 27 Oct 2014 14:45:06 +0000 (14:45 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 27 Oct 2014 14:45:06 +0000 (14:45 +0000)
executable with an invalid value in the NumberOfRvaAndSizes field of the
AOUT header.

PR binutils/17512
* peXXigen.c (_bfd_XXi_swap_aouthdr_in): Handle corrupt binaries
with an invalid value for NumberOfRvaAndSizes.

bfd/ChangeLog
bfd/peXXigen.c

index 7ba4431112bcdb6dbd47ff1b7706602a88ba7267..e1d9379bef868befaee2a5f30772c7a017394469 100644 (file)
@@ -1,5 +1,9 @@
 2014-10-27  Nick Clifton  <nickc@redhat.com>
 
+       PR binutils/17512
+       * peXXigen.c (_bfd_XXi_swap_aouthdr_in): Handle corrupt binaries
+       with an invalid value for NumberOfRvaAndSizes.
+
        PR binutils/17510
        * elf.c (setup_group): Improve handling of corrupt group
        sections.
index 2fb631c5a7687ce634f866116f5592e0a16621f7..987be407737415bf0a2148989c6c02aaf3bc60ab 100644 (file)
@@ -504,6 +504,18 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd,
   {
     int idx;
 
+    /* PR 17512: Corrupt PE binaries can cause seg-faults.  */
+    if (a->NumberOfRvaAndSizes > 16)
+      {
+       (*_bfd_error_handler)
+         (_("%B: aout header specifies an invalid number of data-directory entries: %d"),
+          abfd, a->NumberOfRvaAndSizes);
+       /* Paranoia: If the number is corrupt, then assume that the
+          actual entries themselves might be corrupt as well.  */
+       a->NumberOfRvaAndSizes = 0;
+      }
+
+
     for (idx = 0; idx < a->NumberOfRvaAndSizes; idx++)
       {
         /* If data directory is empty, rva also should be 0.  */