objdump: Fix check for corrupt reloc information, to allow for the fact that PDP11...
authorNick Clifton <nickc@redhat.com>
Thu, 29 Nov 2018 10:57:54 +0000 (10:57 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 29 Nov 2018 10:57:54 +0000 (10:57 +0000)
PR 23931
* objdump.c (dump_relocs_in_section): When checking for an
unreasonable amount of relocs in a bfd, allow for the fact that
the internal representation of a reloc may be bigger than the
external representation.

binutils/ChangeLog
binutils/objdump.c

index f7497780048848d565ff07ba9ca678d288b20419..ea86649a240601b66b1dc92095db29549781dbd1 100644 (file)
@@ -1,3 +1,11 @@
+2018-11-29  Nick Clifton  <nickc@redhat.com>
+
+       PR 23931
+       * objdump.c (dump_relocs_in_section): When checking for an
+       unreasonable amount of relocs in a bfd, allow for the fact that
+       the internal representation of a reloc may be bigger than the
+       external representation.
+
 2018-11-27  Mark Wielaard  <mark@klomp.org>
 
        PR binutils/23919
index e3b8d7fd024ba06ccc94ee4aecfac77666830d3d..21f128431932b1634c4aa4bafcfdc748e1911525 100644 (file)
@@ -3489,7 +3489,12 @@ dump_relocs_in_section (bfd *abfd,
     }
 
   if ((bfd_get_file_flags (abfd) & (BFD_IN_MEMORY | BFD_LINKER_CREATED)) == 0
-      && (((ufile_ptr) relsize > bfd_get_file_size (abfd))
+      && (/* Check that the size of the relocs is reasonable.  Note that some
+            file formats, eg aout, can have relocs whose internal size is
+            larger than their external size, thus we check the size divided
+            by four against the file size.  See PR 23931 for an example of
+            this.  */
+         ((ufile_ptr) (relsize / 4) > bfd_get_file_size (abfd))
          /* Also check the section's reloc count since if this is negative
             (or very large) the computation in bfd_get_reloc_upper_bound
             may have resulted in returning a small, positive integer.
@@ -3500,7 +3505,7 @@ dump_relocs_in_section (bfd *abfd,
             section than there are bytes in that section.  */
          || (section->reloc_count > bfd_get_file_size (abfd))))
     {
-      printf (" (too many: 0x%x)\n", section->reloc_count);
+      printf (" (too many: %#x relocs)\n", section->reloc_count);
       bfd_set_error (bfd_error_file_truncated);
       bfd_fatal (bfd_get_filename (abfd));
     }