Index: src/compiler/wasm-compiler.cc |
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc |
index baa6b7b41b0d9bc0b9dd3baa1a004c7cc169f00c..a0a1b7a23acecef961d1b267284db6f030cd2845 100644 |
--- a/src/compiler/wasm-compiler.cc |
+++ b/src/compiler/wasm-compiler.cc |
@@ -2912,7 +2912,17 @@ void WasmGraphBuilder::BoundsCheckMem(MachineType memtype, Node* index, |
// out of bounds; one check for the offset being in bounds, and the next for |
// the offset + index being out of bounds for code to be patched correctly |
// on relocation. |
- size_t effective_offset = offset + memsize - 1; |
+ |
+ // Check for overflows. |
+ if ((std::numeric_limits<uint32_t>::max() - memsize) + 1 < offset) { |
+ // Always trap. Do not use TrapAlways because it does not create a valid |
+ // graph here. |
+ trap_->TrapIfEq32(wasm::kTrapMemOutOfBounds, jsgraph()->Int32Constant(0), |
+ 0, position); |
+ return; |
+ } |
+ size_t effective_offset = (offset - 1) + memsize; |
+ |
Node* cond = graph()->NewNode(jsgraph()->machine()->Uint32LessThan(), |
jsgraph()->IntPtrConstant(effective_offset), |
jsgraph()->RelocatableInt32Constant( |