Index: src/wasm/module-decoder.cc |
diff --git a/src/wasm/module-decoder.cc b/src/wasm/module-decoder.cc |
index 0f8637f32eeb1785c8a45bad1f585510d13e1f64..10c66b858ed8596c92842da01bb7e956c32df3cf 100644 |
--- a/src/wasm/module-decoder.cc |
+++ b/src/wasm/module-decoder.cc |
@@ -397,7 +397,12 @@ class ModuleDecoder : public Decoder { |
// ===== Global section ================================================== |
if (section_iter.section_code() == kGlobalSectionCode) { |
uint32_t globals_count = consume_u32v("globals count"); |
- module->globals.reserve(SafeReserve(globals_count)); |
+ uint32_t imported_globals = static_cast<uint32_t>(module->globals.size()); |
+ if (!IsWithinLimit(kMaxReserve, globals_count, imported_globals)) { |
Derek Schuff
2016/10/12 05:35:19
OK, so I was afraid this would be a problem; I was
|
+ error(pos, pos, "too many imported+defined globals: %u + %u", |
+ imported_globals, globals_count); |
+ } |
+ module->globals.reserve(SafeReserve(imported_globals + globals_count)); |
for (uint32_t i = 0; ok() && i < globals_count; ++i) { |
TRACE("DecodeGlobal[%d] module+%d\n", i, |
static_cast<int>(pc_ - start_)); |
@@ -405,7 +410,7 @@ class ModuleDecoder : public Decoder { |
module->globals.push_back( |
{kAstStmt, false, WasmInitExpr(), 0, false, false}); |
WasmGlobal* global = &module->globals.back(); |
- DecodeGlobalInModule(module, i, global); |
+ DecodeGlobalInModule(module, i + imported_globals, global); |
} |
section_iter.advance(); |
} |
@@ -617,7 +622,6 @@ class ModuleDecoder : public Decoder { |
uint32_t SafeReserve(uint32_t count) { |
// Avoid OOM by only reserving up to a certain size. |
- const uint32_t kMaxReserve = 20000; |
return count < kMaxReserve ? count : kMaxReserve; |
} |
@@ -656,6 +660,8 @@ class ModuleDecoder : public Decoder { |
ModuleResult result_; |
ModuleOrigin origin_; |
+ static const uint32_t kMaxReserve = 20000; |
+ |
uint32_t off(const byte* ptr) { return static_cast<uint32_t>(ptr - start_); } |
// Decodes a single global entry inside a module starting at {pc_}. |
@@ -669,7 +675,10 @@ class ModuleDecoder : public Decoder { |
case WasmInitExpr::kGlobalIndex: { |
uint32_t other_index = global->init.val.global_index; |
if (other_index >= index) { |
- error("invalid global index in init expression"); |
+ error(pos, pos, |
+ "invalid global index in init expression, " |
+ "index %u, other_index %u", |
+ index, other_index); |
} else if (module->globals[other_index].type != global->type) { |
error(pos, pos, |
"type mismatch in global initialization " |