| Index: src/wasm/wasm-module.cc
 | 
| diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc
 | 
| index 74fa1bf93031e2ab31088ca0b8696f36078a04b8..f3528cafef2de18c1e1046cff883c6b57313fa4f 100644
 | 
| --- a/src/wasm/wasm-module.cc
 | 
| +++ b/src/wasm/wasm-module.cc
 | 
| @@ -1305,7 +1305,7 @@ class WasmInstanceBuilder {
 | 
|        Address mem_start = static_cast<Address>(memory_->backing_store());
 | 
|        uint32_t mem_size =
 | 
|            static_cast<uint32_t>(memory_->byte_length()->Number());
 | 
| -      LoadDataSegments(mem_start, mem_size);
 | 
| +      if (!LoadDataSegments(mem_start, mem_size)) return nothing;
 | 
|  
 | 
|        uint32_t old_mem_size = compiled_module_->mem_size();
 | 
|        Address old_mem_start =
 | 
| @@ -1317,7 +1317,7 @@ class WasmInstanceBuilder {
 | 
|                                       old_mem_size, mem_size);
 | 
|        compiled_module_->set_memory(memory_);
 | 
|      } else {
 | 
| -      LoadDataSegments(nullptr, 0);
 | 
| +      if (!LoadDataSegments(nullptr, 0)) return nothing;
 | 
|      }
 | 
|  
 | 
|      //--------------------------------------------------------------------------
 | 
| @@ -1550,7 +1550,7 @@ class WasmInstanceBuilder {
 | 
|    }
 | 
|  
 | 
|    // Load data segments into the memory.
 | 
| -  void LoadDataSegments(Address mem_addr, size_t mem_size) {
 | 
| +  bool LoadDataSegments(Address mem_addr, size_t mem_size) {
 | 
|      Handle<SeqOneByteString> module_bytes(compiled_module_->module_bytes(),
 | 
|                                            isolate_);
 | 
|      for (const WasmDataSegment& segment : module_->data_segments) {
 | 
| @@ -1558,18 +1558,19 @@ class WasmInstanceBuilder {
 | 
|        // Segments of size == 0 are just nops.
 | 
|        if (source_size == 0) continue;
 | 
|        uint32_t dest_offset = EvalUint32InitExpr(segment.dest_addr);
 | 
| -      if (dest_offset >= mem_size || source_size >= mem_size ||
 | 
| -          dest_offset > (mem_size - source_size)) {
 | 
| +      if (dest_offset + source_size > mem_size ||
 | 
| +          dest_offset + source_size < dest_offset) {
 | 
|          thrower_->LinkError("data segment (start = %" PRIu32 ", size = %" PRIu32
 | 
|                              ") does not fit into memory (size = %" PRIuS ")",
 | 
|                              dest_offset, source_size, mem_size);
 | 
| -        return;
 | 
| +        return false;
 | 
|        }
 | 
|        byte* dest = mem_addr + dest_offset;
 | 
|        const byte* src = reinterpret_cast<const byte*>(
 | 
|            module_bytes->GetCharsAddress() + segment.source_offset);
 | 
|        memcpy(dest, src, source_size);
 | 
|      }
 | 
| +    return true;
 | 
|    }
 | 
|  
 | 
|    void WriteGlobalValue(WasmGlobal& global, Handle<Object> value) {
 | 
| 
 |