]> xenbits.xensource.com Git - people/liuw/xen.git/commit
x86emul/fuzz: add rudimentary limit checking
authorJan Beulich <jbeulich@suse.com>
Mon, 9 Oct 2017 14:01:22 +0000 (16:01 +0200)
committerJan Beulich <jbeulich@suse.com>
Mon, 9 Oct 2017 14:01:22 +0000 (16:01 +0200)
commit7869e2bafe11094260a69a31cb07d17901d07b8b
tree528d034151b12284f9e50dcab625091e07aa4b82
parent3b2eeb7412e529f38d1e8b872ba0bc6ab09a7008
x86emul/fuzz: add rudimentary limit checking

fuzz_insn_fetch() is the only data access helper where it is possible
to see offsets larger than 4Gb in 16- or 32-bit modes, as we leave the
incoming rIP untouched in the emulator itself. The check is needed here
as otherwise, after successfully fetching insn bytes, we may end up
zero-extending EIP soon after complete_insn, which collides with the
X86EMUL_EXCEPTION-conditional respective ASSERT() in
x86_emulate_wrapper(). (NB: put_rep_prefix() is what allows
complete_insn to be reached with rc set to other than X86EMUL_OKAY or
X86EMUL_DONE. See also commit 53f87c03b4 ["x86emul: generalize
exception handling for rep_* hooks"].)

Add assert()-s for all other (data) access routines, as effective
address generation in the emulator ought to guarantee in-range values.
For them to not trigger, several adjustments to the emulator's address
calculations are needed: While the DstBitBase one is really mandatory,
the specification allows for either original or new behavior for two-
part accesses. Observed behavior on real hardware, however, is for such
accesses to silently wrap at the 2^^32 boundary in other than 64-bit
mode, just like they do at the 2^^64 boundary in 64-bit mode, which our
code is now being brought in line with. While adding truncate_ea()
invocations there, also convert open coded instances of it.

Reported-by: George Dunlap <george.dunlap@citrix.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: George Dunlap <george.dunlap@citrix.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
tools/fuzz/x86_instruction_emulator/fuzz-emul.c
xen/arch/x86/x86_emulate/x86_emulate.c