mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-24 04:00:07 +08:00
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:
@ -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>
|
2017-06-14 Sebastian Huber <sebastian.huber@embedded-brains.de>
|
||||||
|
|
||||||
* config.bfd (epiphany-*-elf): Accept epiphany-*-*.
|
* config.bfd (epiphany-*-elf): Accept epiphany-*-*.
|
||||||
|
@ -149,7 +149,7 @@ versados_mkobject (bfd *abfd)
|
|||||||
if (abfd->tdata.versados_data == NULL)
|
if (abfd->tdata.versados_data == NULL)
|
||||||
{
|
{
|
||||||
bfd_size_type amt = sizeof (tdata_type);
|
bfd_size_type amt = sizeof (tdata_type);
|
||||||
tdata_type *tdata = bfd_alloc (abfd, amt);
|
tdata_type *tdata = bfd_zalloc (abfd, amt);
|
||||||
|
|
||||||
if (tdata == NULL)
|
if (tdata == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -345,13 +345,13 @@ reloc_howto_type versados_howto_table[] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
get_offset (int len, unsigned char *ptr)
|
get_offset (unsigned int len, unsigned char *ptr)
|
||||||
{
|
{
|
||||||
int val = 0;
|
int val = 0;
|
||||||
|
|
||||||
if (len)
|
if (len)
|
||||||
{
|
{
|
||||||
int i;
|
unsigned int i;
|
||||||
|
|
||||||
val = *ptr++;
|
val = *ptr++;
|
||||||
if (val & 0x80)
|
if (val & 0x80)
|
||||||
@ -394,9 +394,13 @@ process_otr (bfd *abfd, struct ext_otr *otr, int pass)
|
|||||||
int flag = *srcp++;
|
int flag = *srcp++;
|
||||||
int esdids = (flag >> 5) & 0x7;
|
int esdids = (flag >> 5) & 0x7;
|
||||||
int sizeinwords = ((flag >> 3) & 1) ? 2 : 1;
|
int sizeinwords = ((flag >> 3) & 1) ? 2 : 1;
|
||||||
int offsetlen = flag & 0x7;
|
unsigned int offsetlen = flag & 0x7;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
|
/* PR 21591: Check for invalid lengths. */
|
||||||
|
if (srcp + esdids + offsetlen >= endp)
|
||||||
|
return;
|
||||||
|
|
||||||
if (esdids == 0)
|
if (esdids == 0)
|
||||||
{
|
{
|
||||||
/* A zero esdid means the new pc is the offset given. */
|
/* A zero esdid means the new pc is the offset given. */
|
||||||
|
Reference in New Issue
Block a user