Skip to content

Commit 5ae1724

Browse files
authored
Interpreter: Add a limit to how much we try to grow memory, to avoid DOS (#3227)
growMemory() now also returns whether we succeeded. Without this it could eventually start to swap etc., which is annoying.
1 parent d38ddda commit 5ae1724

File tree

3 files changed

+16
-5
lines changed

3 files changed

+16
-5
lines changed

src/shell-interface.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,14 @@ struct ShellExternalInterface : ModuleInstance::ExternalInterface {
217217

218218
void tableStore(Address addr, Name entry) override { table[addr] = entry; }
219219

220-
void growMemory(Address /*oldSize*/, Address newSize) override {
220+
bool growMemory(Address /*oldSize*/, Address newSize) override {
221+
// Apply a reasonable limit on memory size, 1GB, to avoid DOS on the
222+
// interpreter.
223+
if (newSize > 1024 * 1024 * 1024) {
224+
return false;
225+
}
221226
memory.resize(newSize);
227+
return true;
222228
}
223229

224230
void trap(const char* why) override {

src/tools/wasm-ctor-eval.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ struct CtorEvalExternalInterface : EvallingModuleInstance::ExternalInterface {
283283
// called during initialization, but we don't keep track of a table
284284
void tableStore(Address addr, Name value) override {}
285285

286-
void growMemory(Address /*oldSize*/, Address newSize) override {
286+
bool growMemory(Address /*oldSize*/, Address newSize) override {
287287
throw FailToEvalException("grow memory");
288288
}
289289

src/wasm-interpreter.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1685,7 +1685,7 @@ template<typename GlobalManager, typename SubType> class ModuleInstanceBase {
16851685
LiteralList& arguments,
16861686
Type result,
16871687
SubType& instance) = 0;
1688-
virtual void growMemory(Address oldSize, Address newSize) = 0;
1688+
virtual bool growMemory(Address oldSize, Address newSize) = 0;
16891689
virtual void trap(const char* why) = 0;
16901690
virtual void throwException(Literal exnref) = 0;
16911691

@@ -2406,8 +2406,13 @@ template<typename GlobalManager, typename SubType> class ModuleInstanceBase {
24062406
if (newSize > instance.wasm.memory.max) {
24072407
return fail;
24082408
}
2409-
instance.externalInterface->growMemory(
2410-
instance.memorySize * Memory::kPageSize, newSize * Memory::kPageSize);
2409+
if (!instance.externalInterface->growMemory(
2410+
instance.memorySize * Memory::kPageSize,
2411+
newSize * Memory::kPageSize)) {
2412+
// We failed to grow the memory in practice, even though it was valid
2413+
// to try to do so.
2414+
return fail;
2415+
}
24112416
instance.memorySize = newSize;
24122417
return ret;
24132418
}

0 commit comments

Comments
 (0)