Title: [259691] branches/safari-609-branch/Source/WebCore
Revision
259691
Author
alanc...@apple.com
Date
2020-04-07 17:32:35 -0700 (Tue, 07 Apr 2020)

Log Message

Cherry-pick r259363. rdar://problem/61269736

    CRASH in MediaPlayerPrivateMediaSourceAVFObjC::addAudioRenderer(), uncaught ObjC exception
    https://bugs.webkit.org/show_bug.cgi?id=209827
    <rdar://problem/61113080>

    Reviewed by Eric Carlson.

    -[AVSampleBufferAudioRenderer init] can, in exceptional conditions, return nil. Passing a
    nil object, or another object that AVSampleBufferRenderSynchronizer considers "invalid", into
    -[AVSampleBufferRenderSynchronizer addRenderer:] will throw an exception. Protect against this
    scenario in two ways:

    - Check the return value of -[AVSampleBufferAudioRenderer init], and if nil, log an error,
      log to console, and set the network state to "DecodeError".
    - Wrap calls to -addRenderer: in @try/@catch blocks, which if caught, log an error, assert,
      and set the network state to "DecodeError".

    * Modules/mediasource/MediaSource.cpp:
    (WebCore::MediaSource::failedToCreateRenderer):
    * Modules/mediasource/MediaSource.h:
    * platform/graphics/MediaSourcePrivateClient.h:
    * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm:
    (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::ensureLayer):
    * platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.h:
    * platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm:
    (WebCore::MediaSourcePrivateAVFObjC::failedToCreateAudioRenderer):
    (WebCore::MediaSourcePrivateAVFObjC::failedToCreateVideoRenderer):
    * platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm:
    (WebCore::SourceBufferPrivateAVFObjC::trackDidChangeEnabled):

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

Modified Paths

Diff

Modified: branches/safari-609-branch/Source/WebCore/ChangeLog (259690 => 259691)


--- branches/safari-609-branch/Source/WebCore/ChangeLog	2020-04-08 00:32:31 UTC (rev 259690)
+++ branches/safari-609-branch/Source/WebCore/ChangeLog	2020-04-08 00:32:35 UTC (rev 259691)
@@ -1,5 +1,71 @@
 2020-04-07  Russell Epstein  <repst...@apple.com>
 
+        Cherry-pick r259363. rdar://problem/61269736
+
+    CRASH in MediaPlayerPrivateMediaSourceAVFObjC::addAudioRenderer(), uncaught ObjC exception
+    https://bugs.webkit.org/show_bug.cgi?id=209827
+    <rdar://problem/61113080>
+    
+    Reviewed by Eric Carlson.
+    
+    -[AVSampleBufferAudioRenderer init] can, in exceptional conditions, return nil. Passing a
+    nil object, or another object that AVSampleBufferRenderSynchronizer considers "invalid", into
+    -[AVSampleBufferRenderSynchronizer addRenderer:] will throw an exception. Protect against this
+    scenario in two ways:
+    
+    - Check the return value of -[AVSampleBufferAudioRenderer init], and if nil, log an error,
+      log to console, and set the network state to "DecodeError".
+    - Wrap calls to -addRenderer: in @try/@catch blocks, which if caught, log an error, assert,
+      and set the network state to "DecodeError".
+    
+    * Modules/mediasource/MediaSource.cpp:
+    (WebCore::MediaSource::failedToCreateRenderer):
+    * Modules/mediasource/MediaSource.h:
+    * platform/graphics/MediaSourcePrivateClient.h:
+    * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm:
+    (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::ensureLayer):
+    * platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.h:
+    * platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm:
+    (WebCore::MediaSourcePrivateAVFObjC::failedToCreateAudioRenderer):
+    (WebCore::MediaSourcePrivateAVFObjC::failedToCreateVideoRenderer):
+    * platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm:
+    (WebCore::SourceBufferPrivateAVFObjC::trackDidChangeEnabled):
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259363 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2020-04-01  Jer Noble  <jer.no...@apple.com>
+
+            CRASH in MediaPlayerPrivateMediaSourceAVFObjC::addAudioRenderer(), uncaught ObjC exception
+            https://bugs.webkit.org/show_bug.cgi?id=209827
+            <rdar://problem/61113080>
+
+            Reviewed by Eric Carlson.
+
+            -[AVSampleBufferAudioRenderer init] can, in exceptional conditions, return nil. Passing a
+            nil object, or another object that AVSampleBufferRenderSynchronizer considers "invalid", into
+            -[AVSampleBufferRenderSynchronizer addRenderer:] will throw an exception. Protect against this
+            scenario in two ways:
+
+            - Check the return value of -[AVSampleBufferAudioRenderer init], and if nil, log an error,
+              log to console, and set the network state to "DecodeError".
+            - Wrap calls to -addRenderer: in @try/@catch blocks, which if caught, log an error, assert,
+              and set the network state to "DecodeError".
+
+            * Modules/mediasource/MediaSource.cpp:
+            (WebCore::MediaSource::failedToCreateRenderer):
+            * Modules/mediasource/MediaSource.h:
+            * platform/graphics/MediaSourcePrivateClient.h:
+            * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm:
+            (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::ensureLayer):
+            * platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.h:
+            * platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm:
+            (WebCore::MediaSourcePrivateAVFObjC::failedToCreateAudioRenderer):
+            (WebCore::MediaSourcePrivateAVFObjC::failedToCreateVideoRenderer):
+            * platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm:
+            (WebCore::SourceBufferPrivateAVFObjC::trackDidChangeEnabled):
+
+2020-04-07  Russell Epstein  <repst...@apple.com>
+
         Cherry-pick r259338. rdar://problem/61269727
 
     Support resolution of IPv6 STUN/TURN addresses

Modified: branches/safari-609-branch/Source/WebCore/Modules/mediasource/MediaSource.cpp (259690 => 259691)


--- branches/safari-609-branch/Source/WebCore/Modules/mediasource/MediaSource.cpp	2020-04-08 00:32:31 UTC (rev 259690)
+++ branches/safari-609-branch/Source/WebCore/Modules/mediasource/MediaSource.cpp	2020-04-08 00:32:35 UTC (rev 259691)
@@ -1094,6 +1094,12 @@
 }
 #endif
 
+void MediaSource::failedToCreateRenderer(RendererType type)
+{
+    if (auto context = scriptExecutionContext())
+        context->addConsoleMessage(MessageSource::JS, MessageLevel::Error, makeString("MediaSource ", type == RendererType::Video ? "video" : "audio", " renderer creation failed."));
 }
 
+}
+
 #endif

Modified: branches/safari-609-branch/Source/WebCore/Modules/mediasource/MediaSource.h (259690 => 259691)


--- branches/safari-609-branch/Source/WebCore/Modules/mediasource/MediaSource.h	2020-04-08 00:32:31 UTC (rev 259690)
+++ branches/safari-609-branch/Source/WebCore/Modules/mediasource/MediaSource.h	2020-04-08 00:32:35 UTC (rev 259691)
@@ -124,6 +124,8 @@
     void setLogIdentifier(const void*) final;
 #endif
 
+    void failedToCreateRenderer(RendererType) final;
+
 private:
     explicit MediaSource(ScriptExecutionContext&);
 

Modified: branches/safari-609-branch/Source/WebCore/platform/graphics/MediaSourcePrivateClient.h (259690 => 259691)


--- branches/safari-609-branch/Source/WebCore/platform/graphics/MediaSourcePrivateClient.h	2020-04-08 00:32:31 UTC (rev 259690)
+++ branches/safari-609-branch/Source/WebCore/platform/graphics/MediaSourcePrivateClient.h	2020-04-08 00:32:35 UTC (rev 259691)
@@ -50,6 +50,9 @@
 #if !RELEASE_LOG_DISABLED
     virtual void setLogIdentifier(const void*) = 0;
 #endif
+
+    enum class RendererType { Audio, Video };
+    virtual void failedToCreateRenderer(RendererType) = 0;
 };
 
 }

Modified: branches/safari-609-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm (259690 => 259691)


--- branches/safari-609-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm	2020-04-08 00:32:31 UTC (rev 259690)
+++ branches/safari-609-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm	2020-04-08 00:32:35 UTC (rev 259691)
@@ -759,9 +759,10 @@
     [m_sampleBufferDisplayLayer setName:@"MediaPlayerPrivateMediaSource AVSampleBufferDisplayLayer"];
 #endif
 
-    ASSERT(m_sampleBufferDisplayLayer);
     if (!m_sampleBufferDisplayLayer) {
         ERROR_LOG(LOGIDENTIFIER, "Failed to create AVSampleBufferDisplayLayer");
+        if (m_mediaSourcePrivate)
+            m_mediaSourcePrivate->failedToCreateRenderer(MediaSourcePrivateAVFObjC::RendererType::Video);
         setNetworkState(MediaPlayer::NetworkState::DecodeError);
         return;
     }
@@ -769,7 +770,16 @@
     if ([m_sampleBufferDisplayLayer respondsToSelector:@selector(setPreventsDisplaySleepDuringVideoPlayback:)])
         m_sampleBufferDisplayLayer.get().preventsDisplaySleepDuringVideoPlayback = NO;
 
-    [m_synchronizer addRenderer:m_sampleBufferDisplayLayer.get()];
+    @try {
+        [m_synchronizer addRenderer:m_sampleBufferDisplayLayer.get()];
+    } @catch(NSException *exception) {
+        ERROR_LOG(LOGIDENTIFIER, "-[AVSampleBufferRenderSynchronizer addRenderer:] threw an exception: ", [[exception name] UTF8String], ", reason : ", [[exception reason] UTF8String]);
+        ASSERT_NOT_REACHED();
+
+        setNetworkState(MediaPlayer::NetworkState::DecodeError);
+        return;
+    }
+
     if (m_mediaSourcePrivate)
         m_mediaSourcePrivate->setVideoLayer(m_sampleBufferDisplayLayer.get());
     m_videoFullscreenLayerManager->setVideoLayer(m_sampleBufferDisplayLayer.get(), snappedIntRect(m_player->playerContentBoxRect()).size());
@@ -1128,6 +1138,11 @@
 void MediaPlayerPrivateMediaSourceAVFObjC::addAudioRenderer(AVSampleBufferAudioRenderer* audioRenderer)
 ALLOW_NEW_API_WITHOUT_GUARDS_END
 {
+    if (!audioRenderer) {
+        ASSERT_NOT_REACHED();
+        return;
+    }
+
     if (!m_sampleBufferAudioRendererMap.add((__bridge CFTypeRef)audioRenderer, AudioRendererProperties()).isNewEntry)
         return;
 
@@ -1135,7 +1150,15 @@
     [audioRenderer setVolume:m_player->volume()];
     [audioRenderer setAudioTimePitchAlgorithm:(m_player->preservesPitch() ? AVAudioTimePitchAlgorithmSpectral : AVAudioTimePitchAlgorithmVarispeed)];
 
-    [m_synchronizer addRenderer:audioRenderer];
+    @try {
+        [m_synchronizer addRenderer:audioRenderer];
+    } @catch(NSException *exception) {
+        ERROR_LOG(LOGIDENTIFIER, "-[AVSampleBufferRenderSynchronizer addRenderer:] threw an exception: ", [[exception name] UTF8String], ", reason : ", [[exception reason] UTF8String]);
+        ASSERT_NOT_REACHED();
+
+        setNetworkState(MediaPlayer::NetworkState::DecodeError);
+        return;
+    }
     m_player->renderingModeChanged();
 }
 

Modified: branches/safari-609-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.h (259690 => 259691)


--- branches/safari-609-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.h	2020-04-08 00:32:31 UTC (rev 259690)
+++ branches/safari-609-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.h	2020-04-08 00:32:35 UTC (rev 259691)
@@ -29,6 +29,7 @@
 #if ENABLE(MEDIA_SOURCE) && USE(AVFOUNDATION)
 
 #include "MediaSourcePrivate.h"
+#include "MediaSourcePrivateClient.h"
 #include <wtf/Deque.h>
 #include <wtf/LoggerHelper.h>
 #include <wtf/RefPtr.h>
@@ -110,6 +111,9 @@
     const void* nextSourceBufferLogIdentifier() { return childLogIdentifier(++m_nextSourceBufferID); }
 #endif
 
+    using RendererType = MediaSourcePrivateClient::RendererType;
+    void failedToCreateRenderer(RendererType);
+
 private:
     MediaSourcePrivateAVFObjC(MediaPlayerPrivateMediaSourceAVFObjC*, MediaSourcePrivateClient*);
 

Modified: branches/safari-609-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm (259690 => 259691)


--- branches/safari-609-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm	2020-04-08 00:32:31 UTC (rev 259690)
+++ branches/safari-609-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm	2020-04-08 00:32:35 UTC (rev 259691)
@@ -325,6 +325,11 @@
 }
 #endif
 
+void MediaSourcePrivateAVFObjC::failedToCreateRenderer(RendererType type)
+{
+    m_client->failedToCreateRenderer(type);
 }
 
+}
+
 #endif // ENABLE(MEDIA_SOURCE) && USE(AVFOUNDATION)

Modified: branches/safari-609-branch/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm (259690 => 259691)


--- branches/safari-609-branch/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm	2020-04-08 00:32:31 UTC (rev 259690)
+++ branches/safari-609-branch/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm	2020-04-08 00:32:35 UTC (rev 259691)
@@ -886,6 +886,15 @@
         ALLOW_NEW_API_WITHOUT_GUARDS_END
         if (!m_audioRenderers.contains(trackID)) {
             renderer = adoptNS([PAL::allocAVSampleBufferAudioRendererInstance() init]);
+
+            if (!renderer) {
+                ERROR_LOG(LOGIDENTIFIER, "-[AVSampleBufferAudioRenderer init] returned nil! bailing!");
+                if (m_mediaSource)
+                    m_mediaSource->failedToCreateRenderer(MediaSourcePrivateAVFObjC::RendererType::Audio);
+                m_mediaSource->player()->setNetworkState(MediaPlayer::NetworkState::DecodeError);
+                return;
+            }
+
             auto weakThis = makeWeakPtr(*this);
             [renderer requestMediaDataWhenReadyOnQueue:dispatch_get_main_queue() usingBlock:^{
                 if (weakThis)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to