Changeset 259363 in webkit
- Timestamp:
- Apr 1, 2020 2:15:18 PM (4 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r259359 r259363 1 2020-04-01 Jer Noble <jer.noble@apple.com> 2 3 CRASH in MediaPlayerPrivateMediaSourceAVFObjC::addAudioRenderer(), uncaught ObjC exception 4 https://bugs.webkit.org/show_bug.cgi?id=209827 5 <rdar://problem/61113080> 6 7 Reviewed by Eric Carlson. 8 9 -[AVSampleBufferAudioRenderer init] can, in exceptional conditions, return nil. Passing a 10 nil object, or another object that AVSampleBufferRenderSynchronizer considers "invalid", into 11 -[AVSampleBufferRenderSynchronizer addRenderer:] will throw an exception. Protect against this 12 scenario in two ways: 13 14 - Check the return value of -[AVSampleBufferAudioRenderer init], and if nil, log an error, 15 log to console, and set the network state to "DecodeError". 16 - Wrap calls to -addRenderer: in @try/@catch blocks, which if caught, log an error, assert, 17 and set the network state to "DecodeError". 18 19 * Modules/mediasource/MediaSource.cpp: 20 (WebCore::MediaSource::failedToCreateRenderer): 21 * Modules/mediasource/MediaSource.h: 22 * platform/graphics/MediaSourcePrivateClient.h: 23 * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm: 24 (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::ensureLayer): 25 * platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.h: 26 * platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm: 27 (WebCore::MediaSourcePrivateAVFObjC::failedToCreateAudioRenderer): 28 (WebCore::MediaSourcePrivateAVFObjC::failedToCreateVideoRenderer): 29 * platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm: 30 (WebCore::SourceBufferPrivateAVFObjC::trackDidChangeEnabled): 31 1 32 2020-04-01 Chris Dumez <cdumez@apple.com> 2 33 -
trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp
r259299 r259363 1094 1094 #endif 1095 1095 1096 void MediaSource::failedToCreateRenderer(RendererType type) 1097 { 1098 if (auto context = scriptExecutionContext()) 1099 context->addConsoleMessage(MessageSource::JS, MessageLevel::Error, makeString("MediaSource ", type == RendererType::Video ? "video" : "audio", " renderer creation failed.")); 1100 } 1101 1096 1102 } 1097 1103 -
trunk/Source/WebCore/Modules/mediasource/MediaSource.h
r259252 r259363 123 123 #endif 124 124 125 void failedToCreateRenderer(RendererType) final; 126 125 127 private: 126 128 explicit MediaSource(ScriptExecutionContext&); -
trunk/Source/WebCore/platform/graphics/MediaSourcePrivateClient.h
r241148 r259363 51 51 virtual void setLogIdentifier(const void*) = 0; 52 52 #endif 53 54 enum class RendererType { Audio, Video }; 55 virtual void failedToCreateRenderer(RendererType) = 0; 53 56 }; 54 57 -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm
r259303 r259363 767 767 #endif 768 768 769 if (!m_sampleBufferDisplayLayer) { 770 ERROR_LOG(LOGIDENTIFIER, "Failed to create AVSampleBufferDisplayLayer"); 771 if (m_mediaSourcePrivate) 772 m_mediaSourcePrivate->failedToCreateRenderer(MediaSourcePrivateAVFObjC::RendererType::Video); 773 setNetworkState(MediaPlayer::NetworkState::DecodeError); 774 return; 775 } 776 769 777 #if HAVE(AVSAMPLEBUFFERVIDEOOUTPUT) 770 778 ASSERT(!m_videoOutput); … … 776 784 #endif 777 785 778 ASSERT(m_sampleBufferDisplayLayer);779 if (!m_sampleBufferDisplayLayer) {780 ERROR_LOG(LOGIDENTIFIER, "Failed to create AVSampleBufferDisplayLayer");781 setNetworkState(MediaPlayer::NetworkState::DecodeError);782 return;783 }784 785 786 if ([m_sampleBufferDisplayLayer respondsToSelector:@selector(setPreventsDisplaySleepDuringVideoPlayback:)]) 786 787 m_sampleBufferDisplayLayer.get().preventsDisplaySleepDuringVideoPlayback = NO; 787 788 788 [m_synchronizer addRenderer:m_sampleBufferDisplayLayer.get()]; 789 @try { 790 [m_synchronizer addRenderer:m_sampleBufferDisplayLayer.get()]; 791 } @catch(NSException *exception) { 792 ERROR_LOG(LOGIDENTIFIER, "-[AVSampleBufferRenderSynchronizer addRenderer:] threw an exception: ", [[exception name] UTF8String], ", reason : ", [[exception reason] UTF8String]); 793 ASSERT_NOT_REACHED(); 794 795 setNetworkState(MediaPlayer::NetworkState::DecodeError); 796 return; 797 } 798 789 799 if (m_mediaSourcePrivate) 790 800 m_mediaSourcePrivate->setVideoLayer(m_sampleBufferDisplayLayer.get()); … … 1154 1164 ALLOW_NEW_API_WITHOUT_GUARDS_END 1155 1165 { 1166 if (!audioRenderer) { 1167 ASSERT_NOT_REACHED(); 1168 return; 1169 } 1170 1156 1171 if (!m_sampleBufferAudioRendererMap.add((__bridge CFTypeRef)audioRenderer, AudioRendererProperties()).isNewEntry) 1157 1172 return; … … 1161 1176 [audioRenderer setAudioTimePitchAlgorithm:(m_player->preservesPitch() ? AVAudioTimePitchAlgorithmSpectral : AVAudioTimePitchAlgorithmVarispeed)]; 1162 1177 1163 [m_synchronizer addRenderer:audioRenderer]; 1178 @try { 1179 [m_synchronizer addRenderer:audioRenderer]; 1180 } @catch(NSException *exception) { 1181 ERROR_LOG(LOGIDENTIFIER, "-[AVSampleBufferRenderSynchronizer addRenderer:] threw an exception: ", [[exception name] UTF8String], ", reason : ", [[exception reason] UTF8String]); 1182 ASSERT_NOT_REACHED(); 1183 1184 setNetworkState(MediaPlayer::NetworkState::DecodeError); 1185 return; 1186 } 1164 1187 m_player->renderingModeChanged(); 1165 1188 } -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.h
r256353 r259363 30 30 31 31 #include "MediaSourcePrivate.h" 32 #include "MediaSourcePrivateClient.h" 32 33 #include <wtf/Deque.h> 33 34 #include <wtf/LoggerHelper.h> … … 111 112 #endif 112 113 114 using RendererType = MediaSourcePrivateClient::RendererType; 115 void failedToCreateRenderer(RendererType); 116 113 117 private: 114 118 MediaSourcePrivateAVFObjC(MediaPlayerPrivateMediaSourceAVFObjC*, MediaSourcePrivateClient*); -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm
r253397 r259363 326 326 #endif 327 327 328 void MediaSourcePrivateAVFObjC::failedToCreateRenderer(RendererType type) 329 { 330 m_client->failedToCreateRenderer(type); 331 } 332 328 333 } 329 334 -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm
r258846 r259363 898 898 if (!m_audioRenderers.contains(trackID)) { 899 899 renderer = adoptNS([PAL::allocAVSampleBufferAudioRendererInstance() init]); 900 901 if (!renderer) { 902 ERROR_LOG(LOGIDENTIFIER, "-[AVSampleBufferAudioRenderer init] returned nil! bailing!"); 903 if (m_mediaSource) 904 m_mediaSource->failedToCreateRenderer(MediaSourcePrivateAVFObjC::RendererType::Audio); 905 m_mediaSource->player()->setNetworkState(MediaPlayer::NetworkState::DecodeError); 906 return; 907 } 908 900 909 auto weakThis = makeWeakPtr(*this); 901 910 [renderer requestMediaDataWhenReadyOnQueue:dispatch_get_main_queue() usingBlock:^{
Note: See TracChangeset
for help on using the changeset viewer.