When the image decoding thread makes a callOnMainThread(), ensure all the objects...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 17 May 2017 20:58:42 +0000 (20:58 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 17 May 2017 20:58:42 +0000 (20:58 +0000)
commit8916f918543017aa1b27bc5830a7523995d545aa
tree6aead99c9057a7c376b9ac9872d29666f6fd6230
parenta3a89624795735f510302a61da4e5ffa4396393e
When the image decoding thread makes a callOnMainThread(), ensure all the objects it needs are protected
https://bugs.webkit.org/show_bug.cgi?id=171614

Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2017-05-17
Reviewed by David Kilzer.

The asynchronous image decoding was designed to not block the main thread if
the image is deleted. To achieve that we allow decoding the current frame
even if it is not going to be used after closing the decoding queue. We
protect all the objects which the decoding thread uses. But when a frame
finishes decoding the native image frame is cached on the main thread. Not
all of the objects are protected when the callOnMainThread() is dispatched.
The ImageFrameCache and the ImageDecoder objects are not protected.

This might lead to two kinds of crashes:
1. A segfault inside the ImageDecoder trying to access one of its member
2. A segfault inside the ImageFrameCache trying to access one of its frames

The fix is to protect the ImageFrameCache and the ImageDecoder when the
decoding thread makes a callOnMainThread(). Also switch all the pointers
the decoding threads protect to be ThreadSafeRefCounted.

* platform/graphics/ImageFrameCache.cpp:
(WebCore::ImageFrameCache::startAsyncDecodingQueue):
* platform/graphics/ImageFrameCache.h:
* platform/graphics/cg/ImageDecoderCG.h:
* platform/graphics/win/ImageDecoderDirect2D.h:
* platform/image-decoders/ImageDecoder.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@216998 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/ImageFrameCache.cpp
Source/WebCore/platform/graphics/ImageFrameCache.h
Source/WebCore/platform/graphics/cg/ImageDecoderCG.h
Source/WebCore/platform/graphics/win/ImageDecoderDirect2D.h
Source/WebCore/platform/image-decoders/ImageDecoder.h