Fail if we try to call past the end of the table

This commit is contained in:
Jef
2019-01-18 14:01:12 +01:00
parent b6e29a899e
commit c7956dbdb2
2 changed files with 8 additions and 1 deletions

View File

@@ -2161,6 +2161,8 @@ impl Context<'_> {
let temp1 = self.block_state.regs.take_scratch_gpr(); let temp1 = self.block_state.regs.take_scratch_gpr();
dynasm!(self.asm dynasm!(self.asm
; cmp Rq(callee), [Rq(vmctx_reg) + VmCtx::offset_of_funcs_len() as i32]
; jae >fail
; imul Rq(callee), Rq(callee), mem::size_of::<RuntimeFunc>() as i32 ; imul Rq(callee), Rq(callee), mem::size_of::<RuntimeFunc>() as i32
; mov Rq(temp0), [Rq(vmctx_reg) + VmCtx::offset_of_funcs_ptr() as i32] ; mov Rq(temp0), [Rq(vmctx_reg) + VmCtx::offset_of_funcs_ptr() as i32]
; mov Rd(temp1), [ ; mov Rd(temp1), [
@@ -2170,6 +2172,7 @@ impl Context<'_> {
] ]
; cmp Rd(temp1), signature_hash as i32 ; cmp Rd(temp1), signature_hash as i32
; je =>signature_matches.0 ; je =>signature_matches.0
; fail:
); );
self.trap(); self.trap();
@@ -2252,7 +2255,7 @@ impl Context<'_> {
// We need space to store the register arguments if we need to call a function // We need space to store the register arguments if we need to call a function
// and overwrite these registers so we add `reg_args.len()` // and overwrite these registers so we add `reg_args.len()`
let stack_slots = locals + reg_args.len() as u32; let stack_slots = locals + reg_args.len() as u32 + reg_locals.len() as u32;
// Align stack slots to the nearest even number. This is required // Align stack slots to the nearest even number. This is required
// by x86-64 ABI. // by x86-64 ABI.
let aligned_stack_slots = (stack_slots + 1) & !1; let aligned_stack_slots = (stack_slots + 1) & !1;

View File

@@ -297,6 +297,10 @@ impl VmCtx {
pub fn offset_of_funcs_ptr() -> usize { pub fn offset_of_funcs_ptr() -> usize {
offset_of!(Self, table.ptr) offset_of!(Self, table.ptr)
} }
pub fn offset_of_funcs_len() -> usize {
offset_of!(Self, table.ptr)
}
} }
impl<T> Drop for BoxSlice<T> { impl<T> Drop for BoxSlice<T> {