| 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)) {
|
| + 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 "
|
|
|