Index: src/wasm/module-decoder.cc |
diff --git a/src/wasm/module-decoder.cc b/src/wasm/module-decoder.cc |
index b245e1e07928d996cd19bf7f08c5bf363b009994..8a81f442426616f3408753ccd2c7254d7147e96a 100644 |
--- a/src/wasm/module-decoder.cc |
+++ b/src/wasm/module-decoder.cc |
@@ -161,7 +161,7 @@ class ModuleDecoder : public Decoder { |
if (failed()) break; |
TRACE("DecodeGlobal[%d] module+%d\n", i, |
static_cast<int>(pc_ - start_)); |
- module->globals.push_back({0, MachineType::Int32(), 0, false}); |
+ module->globals.push_back({0, 0, MachineType::Int32(), 0, false}); |
WasmGlobal* global = &module->globals.back(); |
DecodeGlobalInModule(global); |
} |
@@ -252,12 +252,13 @@ class ModuleDecoder : public Decoder { |
import->sig = module->signatures[import->sig_index]; |
} |
const byte* pos = pc_; |
- import->module_name_offset = consume_string("import module name"); |
- if (import->module_name_offset == 0) { |
+ import->module_name_offset = consume_string( |
+ &import->module_name_length, "import module name"); |
+ if (import->module_name_length == 0) { |
error(pos, "import module name cannot be NULL"); |
} |
- import->function_name_offset = |
- consume_string("import function name"); |
+ import->function_name_offset = consume_string( |
+ &import->function_name_length, "import function name"); |
} |
break; |
} |
@@ -285,7 +286,7 @@ class ModuleDecoder : public Decoder { |
exp->func_index, |
static_cast<int>(module->functions.size())); |
} |
- exp->name_offset = consume_string("export name"); |
+ exp->name_offset = consume_string(&exp->name_length, "export name"); |
} |
break; |
} |
@@ -344,6 +345,7 @@ class ModuleDecoder : public Decoder { |
pc_ = start_; |
function->sig = consume_sig(); // read signature |
function->name_offset = 0; // ---- name |
+ function->name_length = 0; // ---- name length |
function->code_start_offset = off(pc_); // ---- code start |
function->code_end_offset = off(limit_); // ---- code end |
function->exported = false; // ---- exported |
@@ -373,7 +375,7 @@ class ModuleDecoder : public Decoder { |
// Decodes a single global entry inside a module starting at {pc_}. |
void DecodeGlobalInModule(WasmGlobal* global) { |
- global->name_offset = consume_string("global name"); |
+ global->name_offset = consume_string(&global->name_length, "global name"); |
global->type = mem_type(); |
global->offset = 0; |
global->exported = consume_u8("exported") != 0; |
@@ -402,7 +404,8 @@ class ModuleDecoder : public Decoder { |
(decl_bits & kDeclFunctionImport) == 0 ? " body" : ""); |
if (decl_bits & kDeclFunctionName) { |
- function->name_offset = consume_string("function name"); |
+ function->name_offset = |
+ consume_string(&function->name_length, "function name"); |
} |
function->exported = decl_bits & kDeclFunctionExport; |
@@ -505,11 +508,14 @@ class ModuleDecoder : public Decoder { |
return offset; |
} |
- // Reads a single 32-bit unsigned integer interpreted as an offset into the |
- // data and validating the string there and advances. |
- uint32_t consume_string(const char* name = nullptr) { |
- // TODO(titzer): validate string |
- return consume_offset(name ? name : "string"); |
+ // Reads a length-prefixed string, checking that it is within bounds. Returns |
+ // the offset of the string, and the length as an out parameter. |
+ uint32_t consume_string(uint32_t* length, const char* name = nullptr) { |
+ int varint_length; |
+ *length = consume_u32v(&varint_length, "string length"); |
+ uint32_t offset = static_cast<uint32_t>(pc_ - start_); |
+ consume_bytes(*length); |
+ return offset; |
} |
// Reads a single 8-bit integer, interpreting it as a local type. |