[binutils-gdb] S12Z: Opcodes: Fix crash when trying to decode a truncated operation.
John Darrington
jmd@sourceware.org
Mon Apr 29 14:13:00 GMT 2019
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=4a90ce955e5bcde074b8616ff9d20f9939a9a358
commit 4a90ce955e5bcde074b8616ff9d20f9939a9a358
Author: John Darrington <john@darrington.wattle.id.au>
Date: Mon Apr 29 16:05:54 2019 +0200
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.
Diff:
---
gas/ChangeLog | 6 ++++++
gas/testsuite/gas/s12z/s12z.exp | 1 +
gas/testsuite/gas/s12z/truncated.d | 17 +++++++++++++++++
gas/testsuite/gas/s12z/truncated.s | 3 +++
opcodes/ChangeLog | 4 ++++
opcodes/s12z-opc.c | 2 +-
6 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 81fcdcc..9f5e9ba 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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>
diff --git a/gas/testsuite/gas/s12z/s12z.exp b/gas/testsuite/gas/s12z/s12z.exp
index 612fda7..e8a0744 100644
--- a/gas/testsuite/gas/s12z/s12z.exp
+++ b/gas/testsuite/gas/s12z/s12z.exp
@@ -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
diff --git a/gas/testsuite/gas/s12z/truncated.d b/gas/testsuite/gas/s12z/truncated.d
new file mode 100644
index 0000000..c6af548
--- /dev/null
+++ b/gas/testsuite/gas/s12z/truncated.d
@@ -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!!
+
diff --git a/gas/testsuite/gas/s12z/truncated.s b/gas/testsuite/gas/s12z/truncated.s
new file mode 100644
index 0000000..a52c390
--- /dev/null
+++ b/gas/testsuite/gas/s12z/truncated.s
@@ -0,0 +1,3 @@
+ nop
+ ;; This is a valid start of an instruction. But it stops in the middle.
+ dc.b 0x14
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 0c2980f..1c9bdbc 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -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>
diff --git a/opcodes/s12z-opc.c b/opcodes/s12z-opc.c
index e40f90e..eef097d 100644
--- a/opcodes/s12z-opc.c
+++ b/opcodes/s12z-opc.c
@@ -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;
More information about the Binutils-cvs
mailing list