Changeset 210501 in webkit


Ignore:
Timestamp:
Jan 9, 2017 4:12:14 AM (7 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK] WebProcess from WebKitGtk+ 2.15.2 SIGSEGVs in std::unique_ptr<SoupBuffer, WTF::GPtrDeleter<SoupBuffer> >::get() const () at /usr/include/c++/6/bits/unique_ptr.h:305
https://bugs.webkit.org/show_bug.cgi?id=165848

Reviewed by Michael Catanzaro.

In r208881 several locks were added to ImageDecoder to prevent frameBufferAtIndex() from being called by multiple
threads at the same time, but I forgot isSizeAvailable() also calls frameBufferAtIndex(). However, what we
really need to protect is the GIFImageDecoder, to never allow decoding from more than one thread at the same
time. This patch reverts r208881 and adds a lock to GIFImageDecoder::decode() instead.

  • platform/image-decoders/ImageDecoder.cpp:

(WebCore::ImageDecoder::frameIsCompleteAtIndex):
(WebCore::ImageDecoder::frameDurationAtIndex):
(WebCore::ImageDecoder::createFrameImageAtIndex):

  • platform/image-decoders/ImageDecoder.h:
  • platform/image-decoders/gif/GIFImageDecoder.cpp:

(WebCore::GIFImageDecoder::decode):

  • platform/image-decoders/gif/GIFImageDecoder.h:
Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r210499 r210501  
     12017-01-09  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] WebProcess from WebKitGtk+ 2.15.2 SIGSEGVs in std::unique_ptr<SoupBuffer, WTF::GPtrDeleter<SoupBuffer> >::get() const () at /usr/include/c++/6/bits/unique_ptr.h:305
     4        https://bugs.webkit.org/show_bug.cgi?id=165848
     5
     6        Reviewed by Michael Catanzaro.
     7
     8        In r208881 several locks were added to ImageDecoder to prevent frameBufferAtIndex() from being called by multiple
     9        threads at the same time, but I forgot isSizeAvailable() also calls frameBufferAtIndex(). However, what we
     10        really need to protect is the GIFImageDecoder, to never allow decoding from more than one thread at the same
     11        time. This patch reverts r208881 and adds a lock to GIFImageDecoder::decode() instead.
     12
     13        * platform/image-decoders/ImageDecoder.cpp:
     14        (WebCore::ImageDecoder::frameIsCompleteAtIndex):
     15        (WebCore::ImageDecoder::frameDurationAtIndex):
     16        (WebCore::ImageDecoder::createFrameImageAtIndex):
     17        * platform/image-decoders/ImageDecoder.h:
     18        * platform/image-decoders/gif/GIFImageDecoder.cpp:
     19        (WebCore::GIFImageDecoder::decode):
     20        * platform/image-decoders/gif/GIFImageDecoder.h:
     21
    1222017-01-09  Alejandro G. Castro  <alex@igalia.com>
    223
  • trunk/Source/WebCore/platform/image-decoders/ImageDecoder.cpp

    r208881 r210501  
    171171bool ImageDecoder::frameIsCompleteAtIndex(size_t index)
    172172{
    173     LockHolder locker(m_lock);
    174173    ImageFrame* buffer = frameBufferAtIndex(index);
    175174    return buffer && buffer->isComplete();
     
    195194float ImageDecoder::frameDurationAtIndex(size_t index)
    196195{
    197     LockHolder locker(m_lock);
    198196    ImageFrame* buffer = frameBufferAtIndex(index);
    199197    if (!buffer || buffer->isEmpty())
     
    216214        return nullptr;
    217215
    218     LockHolder locker(m_lock);
    219216    ImageFrame* buffer = frameBufferAtIndex(index);
    220217    if (!buffer || buffer->isEmpty() || !buffer->hasBackingStore())
  • trunk/Source/WebCore/platform/image-decoders/ImageDecoder.h

    r208985 r210501  
    3535#include "SharedBuffer.h"
    3636#include <wtf/Assertions.h>
    37 #include <wtf/Lock.h>
    3837#include <wtf/Optional.h>
    3938#include <wtf/RefPtr.h>
     
    216215        bool m_isAllDataReceived { false };
    217216        bool m_failed { false };
    218         Lock m_lock;
    219217    };
    220218
  • trunk/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp

    r206481 r210501  
    307307        return;
    308308
     309    LockHolder locker(m_decodeLock);
    309310    if (!m_reader) {
    310311        m_reader = std::make_unique<GIFImageReader>(this);
  • trunk/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.h

    r206481 r210501  
    2727
    2828#include "ImageDecoder.h"
     29#include <wtf/Lock.h>
    2930
    3031class GIFImageReader;
     
    7475        mutable RepetitionCount m_repetitionCount { RepetitionCountOnce };
    7576        std::unique_ptr<GIFImageReader> m_reader;
     77        Lock m_decodeLock;
    7678    };
    7779
Note: See TracChangeset for help on using the changeset viewer.