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 75ec1fdbb7 ("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.
This commit is contained in:
Maciej W. Rozycki 2017-04-12 00:03:41 +01:00
parent 919383ac71
commit c4ab9505b5
2 changed files with 18 additions and 17 deletions

View File

@ -1,3 +1,8 @@
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.

View File

@ -15500,24 +15500,20 @@ process_mips_specific (FILE * file)
if (ent == (bfd_vma) -1)
goto got_print_fail;
if (data)
/* 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)
{
/* 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;
}
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");