Fix seg-faults in objdump when disassembling a corrupt versados binary.

PR binutils/21591
	* versados.c (versados_mkobject): Zero the allocated tdata structure.
	(process_otr): Check for an invalid offset in the otr structure.
This commit is contained in:
Nick Clifton 2017-06-14 10:35:16 +01:00
parent 319c2dbe24
commit 04f963fd48
2 changed files with 14 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2017-06-14 Nick Clifton <nickc@redhat.com>
PR binutils/21591
* versados.c (versados_mkobject): Zero the allocated tdata structure.
(process_otr): Check for an invalid offset in the otr structure.
2017-06-14 Sebastian Huber <sebastian.huber@embedded-brains.de>
* config.bfd (epiphany-*-elf): Accept epiphany-*-*.

View File

@ -149,7 +149,7 @@ versados_mkobject (bfd *abfd)
if (abfd->tdata.versados_data == NULL)
{
bfd_size_type amt = sizeof (tdata_type);
tdata_type *tdata = bfd_alloc (abfd, amt);
tdata_type *tdata = bfd_zalloc (abfd, amt);
if (tdata == NULL)
return FALSE;
@ -345,13 +345,13 @@ reloc_howto_type versados_howto_table[] =
};
static int
get_offset (int len, unsigned char *ptr)
get_offset (unsigned int len, unsigned char *ptr)
{
int val = 0;
if (len)
{
int i;
unsigned int i;
val = *ptr++;
if (val & 0x80)
@ -394,9 +394,13 @@ process_otr (bfd *abfd, struct ext_otr *otr, int pass)
int flag = *srcp++;
int esdids = (flag >> 5) & 0x7;
int sizeinwords = ((flag >> 3) & 1) ? 2 : 1;
int offsetlen = flag & 0x7;
unsigned int offsetlen = flag & 0x7;
int j;
/* PR 21591: Check for invalid lengths. */
if (srcp + esdids + offsetlen >= endp)
return;
if (esdids == 0)
{
/* A zero esdid means the new pc is the offset given. */