- 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)