From f2a4cb0a0edc95ae74816275e82b4ade71c6f37a Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Mon, 16 May 2016 05:10:21 +0200 Subject: x86-asm: Reject some invalid arith imm8 instruction There were two errors in the arithmetic imm8 instruction. They accept only REGW, and in case the user write a xxxb opcode that variant needs to be rejected as well (it's not automatically rejected by REGW in case the destination is memory). --- i386-asm.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'i386-asm.c') diff --git a/i386-asm.c b/i386-asm.c index 8baad47..b25bd42 100644 --- a/i386-asm.c +++ b/i386-asm.c @@ -552,7 +552,14 @@ ST_FUNC void asm_opcode(TCCState *s1, int opcode) continue; s = (opcode - pa->sym) % NBWLX; if ((pa->instr_type & OPC_BWLX) == OPC_WLX) + { + /* We need to reject the xxxb opcodes that we accepted above. + Note that pa->sym for WLX opcodes is the 'w' token, + to get the 'b' token subtract one. */ + if (((opcode - pa->sym + 1) % NBWLX) == 0) + continue; s++; + } } else if (pa->instr_type & OPC_SHIFT) { if (!(opcode >= pa->sym && opcode < pa->sym + 7*NBWLX)) continue; -- cgit v1.3.1