Index: src/wasm/function-body-decoder.cc |
diff --git a/src/wasm/function-body-decoder.cc b/src/wasm/function-body-decoder.cc |
index 152fba1ffe92a42b9cd27c05f1180134cde89ef9..86b83c069c1280acda3cf1439f2c91c2706197f0 100644 |
--- a/src/wasm/function-body-decoder.cc |
+++ b/src/wasm/function-body-decoder.cc |
@@ -622,6 +622,13 @@ class WasmFullDecoder : public WasmDecoder { |
return bytes; |
} |
+ bool CheckHasMemory() { |
+ if (!module_->has_memory) { |
+ error(pc_ - 1, "memory instruction with no memory"); |
+ } |
+ return module_->has_memory; |
+ } |
+ |
// Decodes the body of a function. |
void DecodeFunctionBody() { |
TRACE("wasm-decode %p...%p (module+%d, %d bytes) %s\n", |
@@ -1112,6 +1119,7 @@ class WasmFullDecoder : public WasmDecoder { |
len = DecodeStoreMem(kWasmF64, MachineType::Float64()); |
break; |
case kExprGrowMemory: { |
+ if (!CheckHasMemory()) break; |
MemoryIndexOperand operand(this, pc_); |
DCHECK_NOT_NULL(module_); |
if (module_->origin != kAsmJsOrigin) { |
@@ -1124,6 +1132,7 @@ class WasmFullDecoder : public WasmDecoder { |
break; |
} |
case kExprMemorySize: { |
+ if (!CheckHasMemory()) break; |
MemoryIndexOperand operand(this, pc_); |
Push(kWasmI32, BUILD(CurrentMemoryPages)); |
len = 1 + operand.length; |
@@ -1304,6 +1313,7 @@ class WasmFullDecoder : public WasmDecoder { |
void PopControl() { control_.pop_back(); } |
int DecodeLoadMem(ValueType type, MachineType mem_type) { |
+ if (!CheckHasMemory()) return 0; |
MemoryAccessOperand operand(this, pc_, |
ElementSizeLog2Of(mem_type.representation())); |
@@ -1315,6 +1325,7 @@ class WasmFullDecoder : public WasmDecoder { |
} |
int DecodeStoreMem(ValueType type, MachineType mem_type) { |
+ if (!CheckHasMemory()) return 0; |
MemoryAccessOperand operand(this, pc_, |
ElementSizeLog2Of(mem_type.representation())); |
Value val = Pop(1, type); |