[Win] Crash when scrolling page with images.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 1 Jul 2013 16:38:05 +0000 (16:38 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 1 Jul 2013 16:38:05 +0000 (16:38 +0000)
https://bugs.webkit.org/show_bug.cgi?id=117832

Patch by peavo@outlook.com <peavo@outlook.com> on 2013-07-01
Reviewed by Brent Fulgham.

Avoid access violation by returning early from method if image frame doesn't have pixel data.

* platform/image-decoders/ImageDecoder.h:
(WebCore::ImageFrame::hasPixelData): Added method to check if frame has pixel data.
* platform/image-decoders/gif/GIFImageDecoder.cpp:
(WebCore::GIFImageDecoder::haveDecodedRow): Early return if frame doesn't have pixel data.

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

Source/WebCore/ChangeLog
Source/WebCore/platform/image-decoders/ImageDecoder.h
Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp

index 16c3206..403e05f 100644 (file)
@@ -1,3 +1,17 @@
+2013-07-01  peavo@outlook.com  <peavo@outlook.com>
+
+        [Win] Crash when scrolling page with images.
+        https://bugs.webkit.org/show_bug.cgi?id=117832
+
+        Reviewed by Brent Fulgham.
+
+        Avoid access violation by returning early from method if image frame doesn't have pixel data.
+
+        * platform/image-decoders/ImageDecoder.h:
+        (WebCore::ImageFrame::hasPixelData): Added method to check if frame has pixel data.
+        * platform/image-decoders/gif/GIFImageDecoder.cpp:
+        (WebCore::GIFImageDecoder::haveDecodedRow): Early return if frame doesn't have pixel data.
+
 2013-07-01  Noam Rosenthal  <noam@webkit.org>
 
         Avoid calling RenderLayerBacking::resetContentsRect() if possible
index fab7652..83b9289 100644 (file)
@@ -133,6 +133,11 @@ namespace WebCore {
             return m_bytes + (y * width()) + x;
         }
 
+        inline bool hasPixelData() const
+        {
+            return m_bytes;
+        }
+
         // Use fix point multiplier instead of integer division or floating point math.
         // This multipler produces exactly the same result for all values in range 0 - 255.
         static const unsigned fixPointShift = 24;
index cd32df4..55d0406 100644 (file)
@@ -227,7 +227,7 @@ bool GIFImageDecoder::haveDecodedRow(unsigned frameIndex, const Vector<unsigned
 
     // Initialize the frame if necessary.
     ImageFrame& buffer = m_frameBufferCache[frameIndex];
-    if ((buffer.status() == ImageFrame::FrameEmpty) && !initFrameBuffer(frameIndex))
+    if (((buffer.status() == ImageFrame::FrameEmpty) && !initFrameBuffer(frameIndex)) || !buffer.hasPixelData())
         return false;
 
     ImageFrame::PixelData* currentAddress = buffer.getAddr(xBegin, yBegin);