Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Side by Side Diff: src/wasm/wasm-module.cc

Issue 2416543002: [wasm] Fix bounds check for zero initial memory. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <memory> 5 #include <memory>
6 6
7 #include "src/base/atomic-utils.h" 7 #include "src/base/atomic-utils.h"
8 #include "src/code-stubs.h" 8 #include "src/code-stubs.h"
9 9
10 #include "src/macro-assembler.h" 10 #include "src/macro-assembler.h"
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 DCHECK_EQ(0, bytes[i]); 178 DCHECK_EQ(0, bytes[i]);
179 } 179 }
180 #endif 180 #endif
181 181
182 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); 182 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer();
183 JSArrayBuffer::Setup(buffer, isolate, false, memory, static_cast<int>(size)); 183 JSArrayBuffer::Setup(buffer, isolate, false, memory, static_cast<int>(size));
184 buffer->set_is_neuterable(false); 184 buffer->set_is_neuterable(false);
185 return buffer; 185 return buffer;
186 } 186 }
187 187
188 int UpdateReferencesMask(bool update_globals) {
189 if (update_globals) {
190 return (1 << RelocInfo::WASM_MEMORY_REFERENCE) |
191 (1 << RelocInfo::WASM_MEMORY_BYTE_SIZE_REFERENCE) |
192 (1 << RelocInfo::WASM_MEMORY_WORD_SIZE_REFERENCE) |
193 (1 << RelocInfo::WASM_MEMORY_DWORD_SIZE_REFERENCE) |
194 (1 << RelocInfo::WASM_MEMORY_QWORD_SIZE_REFERENCE) |
195 (1 << RelocInfo::WASM_GLOBAL_REFERENCE);
196 } else {
197 return (1 << RelocInfo::WASM_MEMORY_REFERENCE) |
198 (1 << RelocInfo::WASM_MEMORY_BYTE_SIZE_REFERENCE) |
199 (1 << RelocInfo::WASM_MEMORY_WORD_SIZE_REFERENCE) |
200 (1 << RelocInfo::WASM_MEMORY_DWORD_SIZE_REFERENCE) |
201 (1 << RelocInfo::WASM_MEMORY_QWORD_SIZE_REFERENCE);
202 }
203 }
204
188 void RelocateInstanceCode(Handle<JSObject> instance, Address old_start, 205 void RelocateInstanceCode(Handle<JSObject> instance, Address old_start,
189 Address start, uint32_t prev_size, 206 Address start, uint32_t prev_size,
190 uint32_t new_size) { 207 uint32_t new_size) {
191 Handle<FixedArray> functions = Handle<FixedArray>( 208 Handle<FixedArray> functions = Handle<FixedArray>(
192 FixedArray::cast(instance->GetInternalField(kWasmModuleCodeTable))); 209 FixedArray::cast(instance->GetInternalField(kWasmModuleCodeTable)));
193 for (int i = 0; i < functions->length(); ++i) { 210 for (int i = 0; i < functions->length(); ++i) {
194 Handle<Code> function = Handle<Code>(Code::cast(functions->get(i))); 211 Handle<Code> function = Handle<Code>(Code::cast(functions->get(i)));
195 AllowDeferredHandleDereference embedding_raw_address; 212 AllowDeferredHandleDereference embedding_raw_address;
196 int mask = (1 << RelocInfo::WASM_MEMORY_REFERENCE) | 213 int mask = UpdateReferencesMask(false);
197 (1 << RelocInfo::WASM_MEMORY_SIZE_REFERENCE);
198 for (RelocIterator it(*function, mask); !it.done(); it.next()) { 214 for (RelocIterator it(*function, mask); !it.done(); it.next()) {
199 it.rinfo()->update_wasm_memory_reference(old_start, start, prev_size, 215 it.rinfo()->update_wasm_memory_reference(old_start, start, prev_size,
200 new_size); 216 new_size);
201 } 217 }
202 } 218 }
203 } 219 }
204 220
205 void RelocateGlobals(Handle<JSObject> instance, Address old_start, 221 void RelocateGlobals(Handle<JSObject> instance, Address old_start,
206 Address globals_start) { 222 Address globals_start) {
207 Handle<FixedArray> functions = Handle<FixedArray>( 223 Handle<FixedArray> functions = Handle<FixedArray>(
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 Object* mem_start = compiled_module->ptr_to_heap(); 633 Object* mem_start = compiled_module->ptr_to_heap();
618 Address old_mem_address = nullptr; 634 Address old_mem_address = nullptr;
619 Address globals_start = 635 Address globals_start =
620 GetGlobalStartAddressFromCodeTemplate(undefined, owner); 636 GetGlobalStartAddressFromCodeTemplate(undefined, owner);
621 637
622 if (old_mem_size > 0) { 638 if (old_mem_size > 0) {
623 CHECK_NE(mem_start, undefined); 639 CHECK_NE(mem_start, undefined);
624 old_mem_address = 640 old_mem_address =
625 static_cast<Address>(JSArrayBuffer::cast(mem_start)->backing_store()); 641 static_cast<Address>(JSArrayBuffer::cast(mem_start)->backing_store());
626 } 642 }
627 int mode_mask = RelocInfo::ModeMask(RelocInfo::WASM_MEMORY_REFERENCE) | 643 int mode_mask = UpdateReferencesMask(true);
628 RelocInfo::ModeMask(RelocInfo::WASM_MEMORY_SIZE_REFERENCE) |
629 RelocInfo::ModeMask(RelocInfo::WASM_GLOBAL_REFERENCE);
630 644
631 Object* fct_obj = compiled_module->ptr_to_code_table(); 645 Object* fct_obj = compiled_module->ptr_to_code_table();
632 if (fct_obj != nullptr && fct_obj != undefined && 646 if (fct_obj != nullptr && fct_obj != undefined &&
633 (old_mem_size > 0 || globals_start != nullptr)) { 647 (old_mem_size > 0 || globals_start != nullptr)) {
634 FixedArray* functions = FixedArray::cast(fct_obj); 648 FixedArray* functions = FixedArray::cast(fct_obj);
635 for (int i = 0; i < functions->length(); ++i) { 649 for (int i = 0; i < functions->length(); ++i) {
636 Code* code = Code::cast(functions->get(i)); 650 Code* code = Code::cast(functions->get(i));
637 bool changed = false; 651 bool changed = false;
638 for (RelocIterator it(code, mode_mask); !it.done(); it.next()) { 652 for (RelocIterator it(code, mode_mask); !it.done(); it.next()) {
639 RelocInfo::Mode mode = it.rinfo()->rmode(); 653 RelocInfo::Mode mode = it.rinfo()->rmode();
(...skipping 1389 matching lines...) Expand 10 before | Expand all | Expand 10 after
2029 // Get code table associated with the module js_object 2043 // Get code table associated with the module js_object
2030 Object* obj = object->GetInternalField(kWasmModuleCodeTable); 2044 Object* obj = object->GetInternalField(kWasmModuleCodeTable);
2031 Handle<FixedArray> code_table(FixedArray::cast(obj)); 2045 Handle<FixedArray> code_table(FixedArray::cast(obj));
2032 2046
2033 // Iterate through the code objects in the code table and update relocation 2047 // Iterate through the code objects in the code table and update relocation
2034 // information 2048 // information
2035 for (int i = 0; i < code_table->length(); ++i) { 2049 for (int i = 0; i < code_table->length(); ++i) {
2036 obj = code_table->get(i); 2050 obj = code_table->get(i);
2037 Handle<Code> code(Code::cast(obj)); 2051 Handle<Code> code(Code::cast(obj));
2038 2052
2039 int mode_mask = RelocInfo::ModeMask(RelocInfo::WASM_MEMORY_REFERENCE) | 2053 int mode_mask = UpdateReferencesMask(false);
2040 RelocInfo::ModeMask(RelocInfo::WASM_MEMORY_SIZE_REFERENCE);
2041 for (RelocIterator it(*code, mode_mask); !it.done(); it.next()) { 2054 for (RelocIterator it(*code, mode_mask); !it.done(); it.next()) {
2042 RelocInfo::Mode mode = it.rinfo()->rmode(); 2055 RelocInfo::Mode mode = it.rinfo()->rmode();
2043 if (RelocInfo::IsWasmMemoryReference(mode) || 2056 if (RelocInfo::IsWasmMemoryReference(mode) ||
2044 RelocInfo::IsWasmMemorySizeReference(mode)) { 2057 RelocInfo::IsWasmMemorySizeReference(mode)) {
2045 it.rinfo()->update_wasm_memory_reference(old_start, new_start, old_size, 2058 it.rinfo()->update_wasm_memory_reference(old_start, new_start, old_size,
2046 new_size); 2059 new_size);
2047 } 2060 }
2048 } 2061 }
2049 } 2062 }
2050 return true; 2063 return true;
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
2189 } 2202 }
2190 Address old_mem_start = nullptr; 2203 Address old_mem_start = nullptr;
2191 uint32_t old_size = 0, new_size = 0; 2204 uint32_t old_size = 0, new_size = 0;
2192 2205
2193 MaybeHandle<JSArrayBuffer> maybe_mem_buffer = 2206 MaybeHandle<JSArrayBuffer> maybe_mem_buffer =
2194 GetInstanceMemory(isolate, instance); 2207 GetInstanceMemory(isolate, instance);
2195 Handle<JSArrayBuffer> old_buffer; 2208 Handle<JSArrayBuffer> old_buffer;
2196 if (!maybe_mem_buffer.ToHandle(&old_buffer)) { 2209 if (!maybe_mem_buffer.ToHandle(&old_buffer)) {
2197 // If module object does not have linear memory associated with it, 2210 // If module object does not have linear memory associated with it,
2198 // Allocate new array buffer of given size. 2211 // Allocate new array buffer of given size.
2199 // TODO(gdeepti): Fix bounds check to take into account size of memtype.
2200 new_size = pages * WasmModule::kPageSize; 2212 new_size = pages * WasmModule::kPageSize;
2201 // The code generated in the wasm compiler guarantees this precondition. 2213 // The code generated in the wasm compiler guarantees this precondition.
2202 DCHECK(pages <= WasmModule::kMaxMemPages); 2214 DCHECK(pages <= WasmModule::kMaxMemPages);
2203 } else { 2215 } else {
2204 old_mem_start = static_cast<Address>(old_buffer->backing_store()); 2216 old_mem_start = static_cast<Address>(old_buffer->backing_store());
2205 old_size = old_buffer->byte_length()->Number(); 2217 old_size = old_buffer->byte_length()->Number();
2206 // If the old memory was zero-sized, we should have been in the 2218 // If the old memory was zero-sized, we should have been in the
2207 // "undefined" case above. 2219 // "undefined" case above.
2208 DCHECK_NOT_NULL(old_mem_start); 2220 DCHECK_NOT_NULL(old_mem_start);
2209 DCHECK_NE(0, old_size); 2221 DCHECK_NE(0, old_size);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
2278 WasmCompiledModule* compiled_module = 2290 WasmCompiledModule* compiled_module =
2279 WasmCompiledModule::cast(instance->GetInternalField(kWasmCompiledModule)); 2291 WasmCompiledModule::cast(instance->GetInternalField(kWasmCompiledModule));
2280 CHECK(compiled_module->has_weak_module_object()); 2292 CHECK(compiled_module->has_weak_module_object());
2281 CHECK(compiled_module->ptr_to_weak_module_object()->cleared()); 2293 CHECK(compiled_module->ptr_to_weak_module_object()->cleared());
2282 } 2294 }
2283 2295
2284 } // namespace testing 2296 } // namespace testing
2285 } // namespace wasm 2297 } // namespace wasm
2286 } // namespace internal 2298 } // namespace internal
2287 } // namespace v8 2299 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698