Prevent objdump from aborting when asked to disassemble an unknown type of ARC binary file.

PR 24854
	* arc-dis.c (arc_insn_length): Return 0 rather than aborting when
	encountering an unknown machine type.
	(print_insn_arc): Handle arc_insn_length returning 0.  In error
	cases return -1 rather than calling abort.
This commit is contained in:
Phillipe Antoine
2019-08-07 17:22:29 +01:00
committed by Nick Clifton
parent 7c1c1904be
commit d88bdcb4a5
2 changed files with 19 additions and 6 deletions

View File

@ -1,3 +1,11 @@
2019-08-07 Phillipe Antoine <p.antoine@catenacyber.fr>
PR 24854
* arc-dis.c (arc_insn_length): Return 0 rather than aborting when
encountering an unknown machine type.
(print_insn_arc): Handle arc_insn_length returning 0. In error
cases return -1 rather than calling abort.
2019-08-07 Jan Beulich <jbeulich@suse.com> 2019-08-07 Jan Beulich <jbeulich@suse.com>
* i386-opc.tbl (fld, fstp): Drop FloatMF from extended forms. * i386-opc.tbl (fld, fstp): Drop FloatMF from extended forms.

View File

@ -672,7 +672,7 @@ arc_insn_length (bfd_byte msb, bfd_byte lsb, struct disassemble_info *info)
break; break;
default: default:
abort (); return 0;
} }
} }
@ -1009,7 +1009,6 @@ print_insn_arc (bfd_vma memaddr,
the number of bytes objdump should display on a single line. If the number of bytes objdump should display on a single line. If
the instruction decoder sets this, it should always set it to the instruction decoder sets this, it should always set it to
the same value in order to get reasonable looking output. */ the same value in order to get reasonable looking output. */
info->bytes_per_line = 8; info->bytes_per_line = 8;
/* In the next lines, we set two info variables control the way /* In the next lines, we set two info variables control the way
@ -1017,7 +1016,6 @@ print_insn_arc (bfd_vma memaddr,
8 and bytes_per_chunk is 4, the output will look like this: 8 and bytes_per_chunk is 4, the output will look like this:
00: 00000000 00000000 00: 00000000 00000000
with the chunks displayed according to "display_endian". */ with the chunks displayed according to "display_endian". */
if (info->section if (info->section
&& !(info->section->flags & SEC_CODE)) && !(info->section->flags & SEC_CODE))
{ {
@ -1072,13 +1070,16 @@ print_insn_arc (bfd_vma memaddr,
(*info->fprintf_func) (info->stream, ".word\t0x%08lx", data); (*info->fprintf_func) (info->stream, ".word\t0x%08lx", data);
break; break;
default: default:
abort (); return -1;
} }
return size; return size;
} }
insn_len = arc_insn_length (buffer[highbyte], buffer[lowbyte], info); insn_len = arc_insn_length (buffer[highbyte], buffer[lowbyte], info);
pr_debug ("instruction length = %d bytes\n", insn_len); pr_debug ("instruction length = %d bytes\n", insn_len);
if (insn_len == 0)
return -1;
arc_infop = info->private_data; arc_infop = info->private_data;
arc_infop->insn_len = insn_len; arc_infop->insn_len = insn_len;
@ -1131,7 +1132,7 @@ print_insn_arc (bfd_vma memaddr,
default: default:
/* There is no instruction whose length is not 2, 4, 6, or 8. */ /* There is no instruction whose length is not 2, 4, 6, or 8. */
abort (); return -1;
} }
pr_debug ("instruction value = %llx\n", insn); pr_debug ("instruction value = %llx\n", insn);
@ -1159,24 +1160,28 @@ print_insn_arc (bfd_vma memaddr,
(*info->fprintf_func) (info->stream, ".shor\t%#04llx", (*info->fprintf_func) (info->stream, ".shor\t%#04llx",
insn & 0xffff); insn & 0xffff);
break; break;
case 4: case 4:
(*info->fprintf_func) (info->stream, ".word\t%#08llx", (*info->fprintf_func) (info->stream, ".word\t%#08llx",
insn & 0xffffffff); insn & 0xffffffff);
break; break;
case 6: case 6:
(*info->fprintf_func) (info->stream, ".long\t%#08llx", (*info->fprintf_func) (info->stream, ".long\t%#08llx",
insn & 0xffffffff); insn & 0xffffffff);
(*info->fprintf_func) (info->stream, ".long\t%#04llx", (*info->fprintf_func) (info->stream, ".long\t%#04llx",
(insn >> 32) & 0xffff); (insn >> 32) & 0xffff);
break; break;
case 8: case 8:
(*info->fprintf_func) (info->stream, ".long\t%#08llx", (*info->fprintf_func) (info->stream, ".long\t%#08llx",
insn & 0xffffffff); insn & 0xffffffff);
(*info->fprintf_func) (info->stream, ".long\t%#08llx", (*info->fprintf_func) (info->stream, ".long\t%#08llx",
insn >> 32); insn >> 32);
break; break;
default: default:
abort (); return -1;
} }
info->insn_type = dis_noninsn; info->insn_type = dis_noninsn;