ImageDecoder setSize() should check for backing store allocation failure
authornoel.gordon@gmail.com <noel.gordon@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 29 Nov 2011 00:22:59 +0000 (00:22 +0000)
committernoel.gordon@gmail.com <noel.gordon@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 29 Nov 2011 00:22:59 +0000 (00:22 +0000)
https://bugs.webkit.org/show_bug.cgi?id=72864

Reviewed by Adam Barth.

The backing store of a decoded image is a Vector<PixelData> on the affected
ports. And Vector<> provides a resize capacity member that returns false if
memory allocation fails.

setSize() should be called once only during an image decode - add an ASSERT
for that. Resize the backing store capacity to the requested image size and
return false if memory allocation fails.

ImageDecoder::isOverSize(width, height) is called to check that the decoded
width and height won't overflow 'width x height x sizeof(PixelData)' before
calls to setSize(). Refer to http://webkit.org/b/48634

No new tests. Covered by fast/images/size-failure.html

* platform/image-decoders/ImageDecoder.cpp:
(WebCore::ImageFrame::setSize):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@101302 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/image-decoders/ImageDecoder.cpp

index 37064d4..2aa3a05 100755 (executable)
@@ -1,3 +1,27 @@
+2011-11-28  Noel Gordon  <noel.gordon@gmail.com>
+
+        ImageDecoder setSize() should check for backing store allocation failure
+        https://bugs.webkit.org/show_bug.cgi?id=72864
+
+        Reviewed by Adam Barth.
+
+        The backing store of a decoded image is a Vector<PixelData> on the affected
+        ports. And Vector<> provides a resize capacity member that returns false if
+        memory allocation fails.
+
+        setSize() should be called once only during an image decode - add an ASSERT
+        for that. Resize the backing store capacity to the requested image size and
+        return false if memory allocation fails.
+
+        ImageDecoder::isOverSize(width, height) is called to check that the decoded
+        width and height won't overflow 'width x height x sizeof(PixelData)' before
+        calls to setSize(). Refer to http://webkit.org/b/48634
+
+        No new tests. Covered by fast/images/size-failure.html
+
+        * platform/image-decoders/ImageDecoder.cpp:
+        (WebCore::ImageFrame::setSize):
+
 2011-11-28  Oliver Hunt  <oliver@apple.com>
 
         Fix V8 bindings codegen and add yet more tests for the typed
index ca6369e..f025fbb 100644 (file)
@@ -189,14 +189,14 @@ bool ImageFrame::copyBitmapData(const ImageFrame& other)
 
 bool ImageFrame::setSize(int newWidth, int newHeight)
 {
-    // NOTE: This has no way to check for allocation failure if the requested
-    // size was too big...
-    m_backingStore.resize(newWidth * newHeight);
+    ASSERT(!m_bytes);
+    size_t backingStoreSize = newWidth * newHeight;
+    if (!m_backingStore.tryReserveCapacity(backingStoreSize))
+        return false;
     m_bytes = m_backingStore.data();
     m_size = IntSize(newWidth, newHeight);
 
     zeroFillPixelData();
-
     return true;
 }