diff options
author | Maciej W. Rozycki <macro@imgtec.com> | 2017-04-12 00:03:41 +0100 |
---|---|---|
committer | Maciej W. Rozycki <macro@imgtec.com> | 2017-04-25 21:11:49 +0100 |
commit | c4ab9505b53cdc899506ed421fddb7e1f8faf7a3 (patch) | |
tree | 353e41fc77426895897c5e2bb6575278b0f5c79b /binutils | |
parent | 919383ac718c2a3187ee2a9ad659daa22da26258 (diff) | |
download | gdb-c4ab9505b53cdc899506ed421fddb7e1f8faf7a3.zip gdb-c4ab9505b53cdc899506ed421fddb7e1f8faf7a3.tar.gz gdb-c4ab9505b53cdc899506ed421fddb7e1f8faf7a3.tar.bz2 |
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.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 5 | ||||
-rw-r--r-- | 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"); |