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

Side by Side Diff: third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp

Issue 1414553002: Fix out-of-memory crashes related to ArrayBuffer allocation Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase and applied senorblanco+haraken feedbac Created 5 years, 1 month 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium 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 "config.h" 5 #include "config.h"
6 #include "modules/fetch/BodyStreamBuffer.h" 6 #include "modules/fetch/BodyStreamBuffer.h"
7 7
8 #include "core/dom/DOMArrayBuffer.h" 8 #include "core/dom/DOMArrayBuffer.h"
9 #include "core/dom/DOMTypedArray.h" 9 #include "core/dom/DOMTypedArray.h"
10 #include "core/dom/ExceptionCode.h" 10 #include "core/dom/ExceptionCode.h"
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 206
207 void BodyStreamBuffer::processData() 207 void BodyStreamBuffer::processData()
208 { 208 {
209 ASSERT(m_reader); 209 ASSERT(m_reader);
210 while (m_streamNeedsMore) { 210 while (m_streamNeedsMore) {
211 const void* buffer; 211 const void* buffer;
212 size_t available; 212 size_t available;
213 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebD ataConsumerHandle::FlagNone, &available); 213 WebDataConsumerHandle::Result result = m_reader->beginRead(&buffer, WebD ataConsumerHandle::FlagNone, &available);
214 switch (result) { 214 switch (result) {
215 case WebDataConsumerHandle::Ok: 215 case WebDataConsumerHandle::Ok:
216 m_streamNeedsMore = m_stream->enqueue(DOMUint8Array::create(static_c ast<const unsigned char*>(buffer), available)); 216 {
217 m_reader->endRead(available); 217 // TODO(junov): crbug.com/536816
218 break; 218 // Use createOrNull instead of deprecatedCreateOrCrash in order to
219 // fail gracefully when allocation fails. It would probably be
220 // appropriate to do something like this to handle the failure:
221 //
222 // if (!domArray) {
223 // m_reader = nullptr;
224 // m_stream->error(DOMException::create(V8RangeError, "Out of Memory."));
225 // m_handle.clear();
226 // }
227 //
228 // The spec would need to be amended to support that behavior.
229 // Alternately, we could just proceed with domArray being null i f it
230 // is ascertained that silently droping data is acceptable when the
haraken 2015/10/29 18:58:37 dropping
Justin Novosad 2015/11/05 00:17:52 Done.
231 // alternative is to crash with an out-of-memory exception.
232 RefPtr<DOMUint8Array> domArray = DOMUint8Array::deprecatedCreate OrCrash(static_cast<const unsigned char*>(buffer), available);
233 m_streamNeedsMore = m_stream->enqueue(domArray);
234 m_reader->endRead(available);
235 }
236 return;
219 237
220 case WebDataConsumerHandle::Done: 238 case WebDataConsumerHandle::Done:
221 close(); 239 close();
222 return; 240 return;
223 241
224 case WebDataConsumerHandle::ShouldWait: 242 case WebDataConsumerHandle::ShouldWait:
225 return; 243 return;
226 244
227 case WebDataConsumerHandle::Busy: 245 case WebDataConsumerHandle::Busy:
228 case WebDataConsumerHandle::ResourceExhausted: 246 case WebDataConsumerHandle::ResourceExhausted:
(...skipping 21 matching lines...) Expand all
250 unlock(); 268 unlock();
251 if (mode == EndLoadingDone) { 269 if (mode == EndLoadingDone) {
252 close(); 270 close();
253 } else { 271 } else {
254 ASSERT(mode == EndLoadingErrored); 272 ASSERT(mode == EndLoadingErrored);
255 error(); 273 error();
256 } 274 }
257 } 275 }
258 276
259 } // namespace blink 277 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698