S12Z: Opcodes: Fix crash when trying to decode a truncated operation.

opcodes/
	* s12z-opc.c (shift_discrim): Return OP_INVALID when reading fails.

gas/
	* testsuite/gas/s12z/truncated.d: New file.
	* testsuite/gas/s12z/truncated.s: New file.
	* testsuite/gas/s12z/s12z.exp: Add new test.
This commit is contained in:
John Darrington 2019-04-29 16:05:54 +02:00
parent 637d4b78c5
commit 4a90ce955e
6 changed files with 32 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2019-04-29 John Darrington <john@darrington.wattle.id.au>
* testsuite/gas/s12z/truncated.d: New file.
* testsuite/gas/s12z/truncated.s: New file.
* testsuite/gas/s12z/s12z.exp: Add new test.
2019-04-26 Andrew Bennett <andrew.bennett@imgtec.com>
Faraz Shahbazker <fshahbazker@wavecomp.com>

View File

@ -117,6 +117,7 @@ run_dump_test lea-immu18
run_dump_test ext24-ld-xy
run_dump_test st-xy
run_dump_test bit-manip-invalid
run_dump_test truncated
# Symbol related tests
run_dump_test opr-symbol

View File

@ -0,0 +1,17 @@
#objdump: -d
#name: Handle truncated instruction gracefully.
#source: truncated.s
.*: file format elf32-s12z
Disassembly of section .text:
00000000 <.text>:
0: 01 nop
1: Address 0x0000000000000002 is out of bounds.
Address 0x0000000000000002 is out of bounds.
Address 0x0000000000000002 is out of bounds.
!!invalid!!

View File

@ -0,0 +1,3 @@
nop
;; This is a valid start of an instruction. But it stops in the middle.
dc.b 0x14

View File

@ -1,3 +1,7 @@
2019-04-29 John Darrington <john@darrington.wattle.id.au>
* s12z-opc.c (shift_discrim): Return OP_INVALID when reading fails.
2019-04-26 Andrew Bennett <andrew.bennett@imgtec.com>
Faraz Shahbazker <fshahbazker@wavecomp.com>

View File

@ -2292,7 +2292,7 @@ shift_discrim (struct mem_read_abstraction_base *mra, enum optr hint ATTRIBUTE_
uint8_t sb;
int status = mra->read (mra, 0, 1, &sb);
if (status < 0)
return status;
return OP_INVALID;
enum SB_DIR dir = (sb & 0x40) ? SB_LEFT : SB_RIGHT;
enum SB_TYPE type = (sb & 0x80) ? SB_ARITHMETIC : SB_LOGICAL;