OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/macro-assembler.h" | 5 #include "src/macro-assembler.h" |
6 #include "src/objects.h" | 6 #include "src/objects.h" |
7 #include "src/v8.h" | 7 #include "src/v8.h" |
8 | 8 |
9 #include "src/wasm/decoder.h" | 9 #include "src/wasm/decoder.h" |
10 #include "src/wasm/module-decoder.h" | 10 #include "src/wasm/module-decoder.h" |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 } | 438 } |
439 | 439 |
440 bool IsWithinLimit(uint32_t limit, uint32_t offset, uint32_t size) { | 440 bool IsWithinLimit(uint32_t limit, uint32_t offset, uint32_t size) { |
441 if (offset > limit) return false; | 441 if (offset > limit) return false; |
442 if ((offset + size) < offset) return false; // overflow | 442 if ((offset + size) < offset) return false; // overflow |
443 return (offset + size) <= limit; | 443 return (offset + size) <= limit; |
444 } | 444 } |
445 | 445 |
446 // Decodes a single data segment entry inside a module starting at {pc_}. | 446 // Decodes a single data segment entry inside a module starting at {pc_}. |
447 void DecodeDataSegmentInModule(WasmModule* module, WasmDataSegment* segment) { | 447 void DecodeDataSegmentInModule(WasmModule* module, WasmDataSegment* segment) { |
448 segment->dest_addr = consume_u32("destination"); | 448 const byte* start = pc_; |
449 segment->source_offset = consume_offset("source offset"); | 449 int length; |
450 segment->source_size = consume_u32("source size"); | 450 segment->dest_addr = consume_u32v(&length, "destination"); |
451 segment->init = consume_u8("init"); | 451 segment->source_size = consume_u32v(&length, "source size"); |
| 452 segment->source_offset = static_cast<uint32_t>(pc_ - start_); |
| 453 segment->init = true; |
452 | 454 |
453 // Validate the data is in the module. | 455 // Validate the data is in the module. |
454 uint32_t module_limit = static_cast<uint32_t>(limit_ - start_); | 456 uint32_t module_limit = static_cast<uint32_t>(limit_ - start_); |
455 if (!IsWithinLimit(module_limit, segment->source_offset, | 457 if (!IsWithinLimit(module_limit, segment->source_offset, |
456 segment->source_size)) { | 458 segment->source_size)) { |
457 error(pc_ - sizeof(uint32_t), "segment out of bounds of module"); | 459 error(start, "segment out of bounds of module"); |
458 } | 460 } |
459 | 461 |
460 // Validate that the segment will fit into the (minimum) memory. | 462 // Validate that the segment will fit into the (minimum) memory. |
461 uint32_t memory_limit = | 463 uint32_t memory_limit = |
462 WasmModule::kPageSize * (module ? module->min_mem_pages | 464 WasmModule::kPageSize * (module ? module->min_mem_pages |
463 : WasmModule::kMaxMemPages); | 465 : WasmModule::kMaxMemPages); |
464 if (!IsWithinLimit(memory_limit, segment->dest_addr, | 466 if (!IsWithinLimit(memory_limit, segment->dest_addr, |
465 segment->source_size)) { | 467 segment->source_size)) { |
466 error(pc_ - sizeof(uint32_t), "segment out of bounds of memory"); | 468 error(start, "segment out of bounds of memory"); |
467 } | 469 } |
| 470 |
| 471 consume_bytes(segment->source_size); |
468 } | 472 } |
469 | 473 |
470 // Verifies the body (code) of a given function. | 474 // Verifies the body (code) of a given function. |
471 void VerifyFunctionBody(uint32_t func_num, ModuleEnv* menv, | 475 void VerifyFunctionBody(uint32_t func_num, ModuleEnv* menv, |
472 WasmFunction* function) { | 476 WasmFunction* function) { |
473 if (FLAG_trace_wasm_decode_time) { | 477 if (FLAG_trace_wasm_decode_time) { |
474 OFStream os(stdout); | 478 OFStream os(stdout); |
475 os << "Verifying WASM function " << WasmFunctionName(function, menv) | 479 os << "Verifying WASM function " << WasmFunctionName(function, menv) |
476 << std::endl; | 480 << std::endl; |
477 os << std::endl; | 481 os << std::endl; |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
642 if (function_start > function_end) return FunctionError("start > end"); | 646 if (function_start > function_end) return FunctionError("start > end"); |
643 if (size > kMaxFunctionSize) | 647 if (size > kMaxFunctionSize) |
644 return FunctionError("size > maximum function size"); | 648 return FunctionError("size > maximum function size"); |
645 WasmFunction* function = new WasmFunction(); | 649 WasmFunction* function = new WasmFunction(); |
646 ModuleDecoder decoder(zone, function_start, function_end, kWasmOrigin); | 650 ModuleDecoder decoder(zone, function_start, function_end, kWasmOrigin); |
647 return decoder.DecodeSingleFunction(module_env, function); | 651 return decoder.DecodeSingleFunction(module_env, function); |
648 } | 652 } |
649 } // namespace wasm | 653 } // namespace wasm |
650 } // namespace internal | 654 } // namespace internal |
651 } // namespace v8 | 655 } // namespace v8 |
OLD | NEW |