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

Unified Diff: Source/core/html/ImageData.cpp

Issue 1328343002: Do not crash when out of memory at ImageData::create(). (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/html/ImageData.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/html/ImageData.cpp
diff --git a/Source/core/html/ImageData.cpp b/Source/core/html/ImageData.cpp
index d16984b0e68ac981e492892f37e53e4966839974..f0cec65d2ecd00cf4d5c6b57a1d593615b16ecda 100644
--- a/Source/core/html/ImageData.cpp
+++ b/Source/core/html/ImageData.cpp
@@ -41,10 +41,15 @@ ImageData* ImageData::create(const IntSize& size)
Checked<int, RecordOverflow> dataSize = 4;
dataSize *= size.width();
dataSize *= size.height();
- if (dataSize.hasOverflowed())
+ if (dataSize.hasOverflowed() || dataSize.unsafeGet() < 0)
+ return nullptr;
+
+ RefPtr<DOMUint8ClampedArray> byteArray =
+ DOMUint8ClampedArray::createOrNull(dataSize.unsafeGet());
+ if (!byteArray)
return nullptr;
- return new ImageData(size);
+ return new ImageData(size, byteArray.release());
}
ImageData* ImageData::create(const IntSize& size, PassRefPtr<DOMUint8ClampedArray> byteArray)
@@ -72,12 +77,21 @@ ImageData* ImageData::create(unsigned width, unsigned height, ExceptionState& ex
Checked<unsigned, RecordOverflow> dataSize = 4;
dataSize *= width;
dataSize *= height;
- if (dataSize.hasOverflowed()) {
+ if (dataSize.hasOverflowed()
+ || static_cast<int>(width) < 0
+ || static_cast<int>(height) < 0) {
exceptionState.throwDOMException(IndexSizeError, "The requested image size exceeds the supported range.");
return nullptr;
}
- return new ImageData(IntSize(width, height));
+ RefPtr<DOMUint8ClampedArray> byteArray =
+ DOMUint8ClampedArray::createOrNull(dataSize.unsafeGet());
+ if (!byteArray) {
+ exceptionState.throwDOMException(V8GeneralError, "Out of memory at ImageData creation");
haraken 2015/09/09 09:23:55 What error does Firefox or IE throw for this case?
Yuki 2015/09/09 09:31:30 I failed to make Firefox throw an exception, but I
Yuki 2015/09/09 12:50:10 As far as I tested with Firefox on GNU/Linux, Fire
+ return nullptr;
+ }
+
+ return new ImageData(IntSize(width, height), byteArray.release());
}
bool ImageData::validateConstructorArguments(DOMUint8ClampedArray* data, unsigned width, unsigned& lengthInPixels, ExceptionState& exceptionState)
@@ -147,12 +161,6 @@ v8::Local<v8::Object> ImageData::associateWithWrapper(v8::Isolate* isolate, cons
return wrapper;
}
-ImageData::ImageData(const IntSize& size)
- : m_size(size)
- , m_data(DOMUint8ClampedArray::create(size.width() * size.height() * 4))
-{
-}
-
ImageData::ImageData(const IntSize& size, PassRefPtr<DOMUint8ClampedArray> byteArray)
: m_size(size)
, m_data(byteArray)
« no previous file with comments | « Source/core/html/ImageData.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698