⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 249000 in webkit


Ignore:
Timestamp:
Aug 22, 2019, 2:41:57 AM (7 years ago)
Author:
Chris Dumez
Message:

Fix unsafe usage of MediaStreamTrackPrivate from background thread in MediaStreamTrackPrivate::audioSamplesAvailable()
https://bugs.webkit.org/show_bug.cgi?id=200924

Reviewed by Youenn Fablet.

MediaStreamTrackPrivate is constructed / destructed on the main thread but its MediaStreamTrackPrivate::audioSamplesAvailable()
gets called on a background thread. The audioSamplesAvailable() method may get called until the MediaStreamTrackPrivate
destructor unregisters |this| as an observer from m_source. Event though MediaStreamTrackPrivate subclasses ThreadSafeRefCounted,
ref'ing |this| on the background thread inside audioSamplesAvailable() is still unsafe as the destructor may already be running
on the main thread.

  • platform/mediastream/MediaStreamTrackPrivate.cpp:

(WebCore::MediaStreamTrackPrivate::MediaStreamTrackPrivate):
(WebCore::MediaStreamTrackPrivate::~MediaStreamTrackPrivate):
(WebCore::MediaStreamTrackPrivate::audioSamplesAvailable):

  • platform/mediastream/MediaStreamTrackPrivate.h:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r248998 r249000  
     12019-08-22  Chris Dumez  <cdumez@apple.com>
     2
     3        Fix unsafe usage of MediaStreamTrackPrivate from background thread in MediaStreamTrackPrivate::audioSamplesAvailable()
     4        https://bugs.webkit.org/show_bug.cgi?id=200924
     5
     6        Reviewed by Youenn Fablet.
     7
     8        MediaStreamTrackPrivate is constructed / destructed on the main thread but its MediaStreamTrackPrivate::audioSamplesAvailable()
     9        gets called on a background thread. The audioSamplesAvailable() method may get called until the MediaStreamTrackPrivate
     10        destructor unregisters |this| as an observer from m_source. Event though MediaStreamTrackPrivate subclasses ThreadSafeRefCounted,
     11        ref'ing |this| on the background thread inside audioSamplesAvailable() is still unsafe as the destructor may already be running
     12        on the main thread.
     13
     14        * platform/mediastream/MediaStreamTrackPrivate.cpp:
     15        (WebCore::MediaStreamTrackPrivate::MediaStreamTrackPrivate):
     16        (WebCore::MediaStreamTrackPrivate::~MediaStreamTrackPrivate):
     17        (WebCore::MediaStreamTrackPrivate::audioSamplesAvailable):
     18        * platform/mediastream/MediaStreamTrackPrivate.h:
     19
    1202019-08-22  Fujii Hironori  <Hironori.Fujii@sony.com>
    221
  • trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp

    r247452 r249000  
    5757
    5858MediaStreamTrackPrivate::MediaStreamTrackPrivate(Ref<const Logger>&& logger, Ref<RealtimeMediaSource>&& source, String&& id)
    59     : m_source(WTFMove(source))
     59    : m_weakThis(makeWeakPtr(*this))
     60    , m_source(WTFMove(source))
    6061    , m_id(WTFMove(id))
    6162    , m_logger(WTFMove(logger))
     
    6465#endif
    6566{
     67    ASSERT(isMainThread());
    6668    UNUSED_PARAM(logger);
    6769#if !RELEASE_LOG_DISABLED
     
    7375MediaStreamTrackPrivate::~MediaStreamTrackPrivate()
    7476{
     77    ASSERT(isMainThread());
    7578    m_source->removeObserver(*this);
    7679}
     
    263266{
    264267    if (!m_hasSentStartProducedData) {
    265         callOnMainThread([this, protectedThis = makeRef(*this)] {
     268        callOnMainThread([this, weakThis = m_weakThis] {
     269            if (!weakThis)
     270                return;
     271
    266272            if (!m_haveProducedData) {
    267273                m_haveProducedData = true;
  • trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h

    r247211 r249000  
    3232#include "RealtimeMediaSource.h"
    3333#include <wtf/LoggerHelper.h>
     34#include <wtf/WeakPtr.h>
    3435
    3536namespace WebCore {
     
    4344class MediaStreamTrackPrivate final
    4445    : public ThreadSafeRefCounted<MediaStreamTrackPrivate, WTF::DestructionThread::Main>
     46    , public CanMakeWeakPtr<MediaStreamTrackPrivate>
    4547    , public RealtimeMediaSource::Observer
    4648#if !RELEASE_LOG_DISABLED
     
    143145#endif
    144146
     147    WeakPtr<MediaStreamTrackPrivate> m_weakThis;
    145148    mutable RecursiveLock m_observersLock;
    146149    HashSet<Observer*> m_observers;
Note: See TracChangeset for help on using the changeset viewer.