From: Paolo Bonzini Date: Fri, 14 Nov 2025 23:57:52 +0000 (+0100) Subject: target/i386/tcg: validate segment registers X-Git-Tag: v10.2.0-rc2~15^2~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ebb46ba6a4a20d393a6889c21e8a80dabab4cc8e;p=thirdparty%2Fqemu.git target/i386/tcg: validate segment registers Correctly reject invalid segment registers, including CS when used as the destination of a MOV. Ignore the REX prefix as well. Fixes: 5e9e21bcc4d ("target/i386: move 60-BF opcodes to new decoder", 2024-05-07) Cc: qemu-stable@nongnu.org Resolves: https://gitlab.com/qemu-project/qemu/-/issues/3195 Signed-off-by: Paolo Bonzini --- diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.c.inc index 805cfd08e8..0f8c5d1693 100644 --- a/target/i386/tcg/decode-new.c.inc +++ b/target/i386/tcg/decode-new.c.inc @@ -2059,7 +2059,12 @@ static bool decode_op(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode, case X86_TYPE_S: /* reg selects a segment register */ op->unit = X86_OP_SEG; - goto get_reg; + op->n = (get_modrm(s, env) >> 3) & 7; + /* Values outside [CDEFGS]S, as well as storing to CS, are invalid. */ + if (op->n >= 6 || (op->n == R_CS && op == &decode->op[0])) { + return false; + } + break; case X86_TYPE_P: op->unit = X86_OP_MMX;