[sim] Increase the simulator's stack limit margin
The current safety margin between the JS stack limit and the actual boundary of the stack space reserved by the simulator can be overrun by a large frame. Raise this margin to 4KiB, corresponding to the "large frame" threshold. This ensures that the stack check is executed before the frame is allocated if the frame is larger than this margin. R=clemensb@chromium.org Bug: chromium:1308333 Change-Id: I3e1a51bb36c630c7e37e58679971392dada2a83e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3560435 Reviewed-by: Jakob Kummerow <jkummerow@chromium.org> Commit-Queue: Thibaud Michaud <thibaudm@chromium.org> Cr-Commit-Position: refs/heads/main@{#79711}
This commit is contained in:
parent
c3ee94d848
commit
d36f596e8a
@ -1139,9 +1139,9 @@ uintptr_t Simulator::StackLimit(uintptr_t c_limit) const {
|
||||
return reinterpret_cast<uintptr_t>(get_sp());
|
||||
}
|
||||
|
||||
// Otherwise the limit is the JS stack. Leave a safety margin of 1024 bytes
|
||||
// Otherwise the limit is the JS stack. Leave a safety margin of 4 KiB
|
||||
// to prevent overrunning the stack when pushing values.
|
||||
return reinterpret_cast<uintptr_t>(stack_) + 1024;
|
||||
return reinterpret_cast<uintptr_t>(stack_) + 4 * KB;
|
||||
}
|
||||
|
||||
// Unsupported instructions use Format to print an error and stop execution.
|
||||
|
@ -313,9 +313,9 @@ uintptr_t Simulator::StackLimit(uintptr_t c_limit) const {
|
||||
return get_sp();
|
||||
}
|
||||
|
||||
// Otherwise the limit is the JS stack. Leave a safety margin of 1024 bytes
|
||||
// Otherwise the limit is the JS stack. Leave a safety margin of 4 KiB
|
||||
// to prevent overrunning the stack when pushing values.
|
||||
return stack_limit_ + 1024;
|
||||
return stack_limit_ + 4 * KB;
|
||||
}
|
||||
|
||||
void Simulator::SetRedirectInstruction(Instruction* instruction) {
|
||||
|
260
test/mjsunit/regress/wasm/regress-1308333.js
Normal file
260
test/mjsunit/regress/wasm/regress-1308333.js
Normal file
@ -0,0 +1,260 @@
|
||||
// Copyright 2022 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --wasm-staging --experimental-wasm-gc
|
||||
|
||||
d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
|
||||
|
||||
const builder = new WasmModuleBuilder();
|
||||
builder.addType(makeSig([kWasmI32, kWasmI32, kWasmI32], [kWasmI32]));
|
||||
builder.addMemory(16, 32, false);
|
||||
// Generate function 1 (out of 1).
|
||||
builder.addFunction(undefined, 0 /* sig */)
|
||||
.addBodyWithEnd([
|
||||
// signature: i_iii
|
||||
// body:
|
||||
kExprI32Const, 0xe2, 0x80, 0xae, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x00, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32And, // i32.and
|
||||
kExprCallFunction, 0x00, // call function #0: i_iii
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x78, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x00, // i32.const
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x78, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32And, // i32.and
|
||||
kExprCallFunction, 0x00, // call function #0: i_iii
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x78, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x00, // i32.const
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x78, // i32.const
|
||||
kExprI32Xor, // i32.xor
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x78, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32And, // i32.and
|
||||
kExprCallFunction, 0x00, // call function #0: i_iii
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x78, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x00, // i32.const
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x78, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32And, // i32.and
|
||||
kExprCallFunction, 0x00, // call function #0: i_iii
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x78, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x00, // i32.const
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x78, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32And, // i32.and
|
||||
kExprCallFunction, 0x00, // call function #0: i_iii
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x78, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x00, // i32.const
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x78, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32And, // i32.and
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32And, // i32.and
|
||||
kExprCallFunction, 0x00, // call function #0: i_iii
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x78, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x00, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x78, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32And, // i32.and
|
||||
kExprCallFunction, 0x00, // call function #0: i_iii
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x78, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x78, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x10, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32And, // i32.and
|
||||
kExprCallFunction, 0x00, // call function #0: i_iii
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x00, // i32.const
|
||||
kExprI32Const, 0x7c, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprI32Const, 0x73, // i32.const
|
||||
kExprUnreachable, // unreachable
|
||||
kExprEnd // end @353
|
||||
]).exportAs("main");
|
||||
let instance = builder.instantiate();
|
||||
assertThrows(() => instance.exports.main(1, 2, 3));
|
Loading…
Reference in New Issue
Block a user