Fix runtime seg-fault in readelf when parsing a corrupt MIPS binary.

PR binutils/21344
	* readelf.c (process_mips_specific): Check for an out of range GOT
	entry before reading the module pointer.
This commit is contained in:
Nick Clifton 2017-04-03 11:13:21 +01:00
parent f32ba72991
commit 75ec1fdbb7
2 changed files with 23 additions and 7 deletions

View File

@ -1,3 +1,9 @@
2017-04-03 Nick Clifton <nickc@redhat.com>
PR binutils/21344
* readelf.c (process_mips_specific): Check for an out of range GOT
entry before reading the module pointer.
2017-04-03 Nick Clifton <nickc@redhat.com>
PR binutils/21343

View File

@ -15464,14 +15464,24 @@ process_mips_specific (FILE * file)
printf (_(" Lazy resolver\n"));
if (ent == (bfd_vma) -1)
goto got_print_fail;
if (data
&& (byte_get (data + ent - pltgot, addr_size)
>> (addr_size * 8 - 1)) != 0)
if (data)
{
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;
/* PR 21344 */
if (data + ent - pltgot > data_end - addr_size)
{
error (_("Invalid got entry - %#lx - overflows GOT table\n"), 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;
}
}
printf ("\n");