This is the mail archive of the
binutils-cvs@sourceware.org
mailing list for the binutils project.
[binutils-gdb] MIPS/readelf: Simplify GOT[1] data availability check
- From: Maciej W.Rozycki <macro at sourceware dot org>
- To: bfd-cvs at sourceware dot org
- Date: 25 Apr 2017 20:13:58 -0000
- Subject: [binutils-gdb] MIPS/readelf: Simplify GOT[1] data availability check
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=c4ab9505b53cdc899506ed421fddb7e1f8faf7a3
commit c4ab9505b53cdc899506ed421fddb7e1f8faf7a3
Author: Maciej W. Rozycki <macro@imgtec.com>
Date: Wed Apr 12 00:03:41 2017 +0100
MIPS/readelf: Simplify GOT[1] data availability check
Unavailable data is handled gracefully in MIPS GOT processing done by
`print_mips_got_entry', so all that is needed in special GOT[1] handling
is to verify whether data can be retrieved for the purpose of the GNU
marker check done with `byte_get'. Remove the extra error reporting
code then, introduced with commit 75ec1fdbb797 ("Fix runtime seg-fault
in readelf when parsing a corrupt MIPS binary.") in the course of
addressing PR binutils/21344, and defer the error case to regular local
GOT entry processing.
binutils/
* readelf.c (process_mips_specific): Remove error reporting from
GOT[1] processing.
Diff:
---
binutils/ChangeLog | 5 +++++
binutils/readelf.c | 32 ++++++++++++++------------------
2 files changed, 19 insertions(+), 18 deletions(-)
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 0b6a712..7f8e29d 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,5 +1,10 @@
2017-04-25 Maciej W. Rozycki <macro@imgtec.com>
+ * readelf.c (process_mips_specific): Remove error reporting from
+ GOT[1] processing.
+
+2017-04-25 Maciej W. Rozycki <macro@imgtec.com>
+
* readelf.c (process_mips_specific): Remove null GOT data check.
2017-04-25 Maciej W. Rozycki <macro@imgtec.com>
diff --git a/binutils/readelf.c b/binutils/readelf.c
index d4c4137..1139f71 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -15500,24 +15500,20 @@ process_mips_specific (FILE * file)
if (ent == (bfd_vma) -1)
goto got_print_fail;
- if (data)
- {
- /* PR 21344 */
- if (data + ent - pltgot > data_end - addr_size)
- {
- error (_("Invalid got entry - %#lx - overflows GOT table\n"),
- (long) ent);
- goto got_print_fail;
- }
-
- if (byte_get (data + ent - pltgot, addr_size)
- >> (addr_size * 8 - 1) != 0)
- {
- ent = print_mips_got_entry (data, pltgot, ent, data_end);
- printf (_(" Module pointer (GNU extension)\n"));
- if (ent == (bfd_vma) -1)
- goto got_print_fail;
- }
+ /* Check for the MSB of GOT[1] being set, denoting a GNU object.
+ This entry will be used by some runtime loaders, to store the
+ module pointer. Otherwise this is an ordinary local entry.
+ PR 21344: Check for the entry being fully available before
+ fetching it. */
+ if (data
+ && data + ent - pltgot + addr_size <= data_end
+ && (byte_get (data + ent - pltgot, addr_size)
+ >> (addr_size * 8 - 1)) != 0)
+ {
+ ent = print_mips_got_entry (data, pltgot, ent, data_end);
+ printf (_(" Module pointer (GNU extension)\n"));
+ if (ent == (bfd_vma) -1)
+ goto got_print_fail;
}
printf ("\n");