mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
x86/hvm: Fixes to hvmemul_insn_fetch()
Force insn_off to a single byte, as offset can wrap around or truncate with respect to sh_ctxt->insn_buf_eip under a number of normal circumstances. Furthermore, don't use an ASSERT() for bounds checking the write into hvmemul_ctxt->insn_buf[]. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Paul Durrant <paul.durrant@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
ab48596654
commit
0943a03037
1 file changed
+13
-2
@@ -939,7 +939,8 @@ int hvmemul_insn_fetch(
|
||||
{
|
||||
struct hvm_emulate_ctxt *hvmemul_ctxt =
|
||||
container_of(ctxt, struct hvm_emulate_ctxt, ctxt);
|
||||
unsigned int insn_off = offset - hvmemul_ctxt->insn_buf_eip;
|
||||
/* Careful, as offset can wrap or truncate WRT insn_buf_eip. */
|
||||
uint8_t insn_off = offset - hvmemul_ctxt->insn_buf_eip;
|
||||
|
||||
/*
|
||||
* Fall back if requested bytes are not in the prefetch cache.
|
||||
@@ -953,7 +954,17 @@ int hvmemul_insn_fetch(
|
||||
|
||||
if ( rc == X86EMUL_OKAY && bytes )
|
||||
{
|
||||
ASSERT(insn_off + bytes <= sizeof(hvmemul_ctxt->insn_buf));
|
||||
/*
|
||||
* Will we overflow insn_buf[]? This shouldn't be able to happen,
|
||||
* which means something went wrong with instruction decoding...
|
||||
*/
|
||||
if ( insn_off > sizeof(hvmemul_ctxt->insn_buf) ||
|
||||
(insn_off + bytes) > sizeof(hvmemul_ctxt->insn_buf) )
|
||||
{
|
||||
ASSERT_UNREACHABLE();
|
||||
return X86EMUL_UNHANDLEABLE;
|
||||
}
|
||||
|
||||
memcpy(&hvmemul_ctxt->insn_buf[insn_off], p_data, bytes);
|
||||
hvmemul_ctxt->insn_buf_bytes = insn_off + bytes;
|
||||
}
|
||||
|
||||