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

Side by Side Diff: third_party/WebKit/Source/bindings/modules/v8/V8BindingForModules.cpp

Issue 1414553002: Fix out-of-memory crashes related to ArrayBuffer allocation Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 switch (key->type()) { 89 switch (key->type()) {
90 case IDBKey::InvalidType: 90 case IDBKey::InvalidType:
91 case IDBKey::MinType: 91 case IDBKey::MinType:
92 ASSERT_NOT_REACHED(); 92 ASSERT_NOT_REACHED();
93 return v8Undefined(); 93 return v8Undefined();
94 case IDBKey::NumberType: 94 case IDBKey::NumberType:
95 return v8::Number::New(isolate, key->number()); 95 return v8::Number::New(isolate, key->number());
96 case IDBKey::StringType: 96 case IDBKey::StringType:
97 return v8String(isolate, key->string()); 97 return v8String(isolate, key->string());
98 case IDBKey::BinaryType: 98 case IDBKey::BinaryType:
99 // Experimental feature: binary keys 99 {
100 // https://w3c.github.io/IndexedDB/#steps-to-convert-a-key-to-a-value 100 // Experimental feature: binary keys
101 return toV8(DOMArrayBuffer::create(reinterpret_cast<const unsigned char* >(key->binary()->data()), key->binary()->size()), creationContext, isolate); 101 // https://w3c.github.io/IndexedDB/#steps-to-convert-a-key-to-a-valu e
102 RefPtr<DOMArrayBuffer> buffer = DOMArrayBuffer::createOrNull(reinter pret_cast<const unsigned char*>(key->binary()->data()), key->binary()->size());
103 if (!buffer) {
104 isolate->ThrowException(v8::Exception::RangeError(v8::String::Ne wFromUtf8(isolate, "Out of memory. Failed to allocate ArrayBuffer.")));
jsbell 2015/10/16 22:12:24 This is going to be weird behavior! The scenario w
jsbell 2015/10/16 22:16:26 Hrm, I'm an idiot... this *also* applies to *value
Justin Novosad 2015/10/19 16:42:52 For this initial CL, I want to stay clear of anyth
105 return v8Undefined();
106 }
107 return toV8(buffer, creationContext, isolate);
108 }
102 case IDBKey::DateType: 109 case IDBKey::DateType:
103 return v8::Date::New(context, key->date()).ToLocalChecked(); 110 return v8::Date::New(context, key->date()).ToLocalChecked();
104 case IDBKey::ArrayType: 111 case IDBKey::ArrayType:
105 { 112 {
106 v8::Local<v8::Array> array = v8::Array::New(isolate, key->array().si ze()); 113 v8::Local<v8::Array> array = v8::Array::New(isolate, key->array().si ze());
107 for (size_t i = 0; i < key->array().size(); ++i) { 114 for (size_t i = 0; i < key->array().size(); ++i) {
108 v8::Local<v8::Value> value = toV8(key->array()[i].get(), creatio nContext, isolate); 115 v8::Local<v8::Value> value = toV8(key->array()[i].get(), creatio nContext, isolate);
109 if (value.IsEmpty()) 116 if (value.IsEmpty())
110 value = v8::Undefined(isolate); 117 value = v8::Undefined(isolate);
111 if (!v8CallBoolean(array->CreateDataProperty(context, i, value)) ) 118 if (!v8CallBoolean(array->CreateDataProperty(context, i, value)) )
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 if (buffer->isNeutered()) { 185 if (buffer->isNeutered()) {
179 exceptionState.throwTypeError("The ArrayBuffer is neutered."); 186 exceptionState.throwTypeError("The ArrayBuffer is neutered.");
180 return nullptr; 187 return nullptr;
181 } 188 }
182 const char* start = static_cast<const char*>(buffer->data()); 189 const char* start = static_cast<const char*>(buffer->data());
183 size_t length = buffer->byteLength(); 190 size_t length = buffer->byteLength();
184 return IDBKey::createBinary(SharedBuffer::create(start, length)); 191 return IDBKey::createBinary(SharedBuffer::create(start, length));
185 } 192 }
186 if (value->IsArrayBufferView()) { 193 if (value->IsArrayBufferView()) {
187 DOMArrayBufferView* view = V8ArrayBufferView::toImpl(value.As<v8::Ob ject>()); 194 DOMArrayBufferView* view = V8ArrayBufferView::toImpl(value.As<v8::Ob ject>());
188 if (view->buffer()->isNeutered()) { 195 RefPtr<DOMArrayBuffer> buffer = view->bufferOrNull();
196 if (!buffer) {
jsbell 2015/10/16 22:12:24 The usage here is that script has passed a view in
Justin Novosad 2015/10/19 16:42:52 Acknowledged.
197 exceptionState.throwRangeError("Out of Momory.");
binji 2015/10/16 22:12:39 sp: memory
Justin Novosad 2015/10/19 16:42:52 Acknowledged.
198 return nullptr;
199 }
200 if (buffer->isNeutered()) {
189 exceptionState.throwTypeError("The viewed ArrayBuffer is neutere d."); 201 exceptionState.throwTypeError("The viewed ArrayBuffer is neutere d.");
190 return nullptr; 202 return nullptr;
191 } 203 }
192 const char* start = static_cast<const char*>(view->baseAddress()); 204 const char* start = static_cast<const char*>(view->baseAddress());
193 size_t length = view->byteLength(); 205 size_t length = view->byteLength();
194 return IDBKey::createBinary(SharedBuffer::create(start, length)); 206 return IDBKey::createBinary(SharedBuffer::create(start, length));
195 } 207 }
196 } 208 }
197 if (value->IsArray()) { 209 if (value->IsArray()) {
198 v8::Local<v8::Array> array = value.As<v8::Array>(); 210 v8::Local<v8::Array> array = value.As<v8::Array>();
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 ASSERT(!exceptionState.hadException()); 523 ASSERT(!exceptionState.hadException());
512 if (expectedKey && expectedKey->isEqual(value->primaryKey())) 524 if (expectedKey && expectedKey->isEqual(value->primaryKey()))
513 return; 525 return;
514 526
515 bool injected = injectV8KeyIntoV8Value(isolate, keyValue.v8Value(), scriptVa lue.v8Value(), value->keyPath()); 527 bool injected = injectV8KeyIntoV8Value(isolate, keyValue.v8Value(), scriptVa lue.v8Value(), value->keyPath());
516 ASSERT_UNUSED(injected, injected); 528 ASSERT_UNUSED(injected, injected);
517 } 529 }
518 #endif 530 #endif
519 531
520 } // namespace blink 532 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698