Title: [165751] trunk/Source/WebCore
Revision
165751
Author
[email protected]
Date
2014-03-17 13:23:36 -0700 (Mon, 17 Mar 2014)

Log Message

[EME] Add NULL protections in SourceBuffer and MediaSource.
https://bugs.webkit.org/show_bug.cgi?id=130266

Reviewed by Eric Carlson.

Add NULL checks in places which may be called after a SourceBuffer has been removed:

* Modules/mediasource/MediaSource.cpp:
(WebCore::MediaSource::monitorSourceBuffers): Protect against a SourceBuffer being removed
    (and thus activeSourceBuffers being empty) when monitoring source buffer state.
* Modules/mediasource/SourceBuffer.cpp:
(WebCore::SourceBuffer::appendBufferTimerFired): Protect against SourceBuffer being removed.
(WebCore::SourceBuffer::videoTracks): Ditto.
(WebCore::SourceBuffer::audioTracks): Ditto.
(WebCore::SourceBuffer::textTracks): Ditto.
(WebCore::SourceBuffer::setActive): Ditto.
(WebCore::SourceBuffer::sourceBufferPrivateDidEndStream): Ditto.
(WebCore::SourceBuffer::hasCurrentTime): Ditto.
(WebCore::SourceBuffer::canPlayThrough): Ditto.
(WebCore::SourceBuffer::hasFutureTime): Ditto, and check for an empty buffered ranges.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (165750 => 165751)


--- trunk/Source/WebCore/ChangeLog	2014-03-17 20:19:24 UTC (rev 165750)
+++ trunk/Source/WebCore/ChangeLog	2014-03-17 20:23:36 UTC (rev 165751)
@@ -1,3 +1,26 @@
+2014-03-17  Jer Noble  <[email protected]>
+
+        [EME] Add NULL protections in SourceBuffer and MediaSource.
+        https://bugs.webkit.org/show_bug.cgi?id=130266
+
+        Reviewed by Eric Carlson.
+
+        Add NULL checks in places which may be called after a SourceBuffer has been removed:
+
+        * Modules/mediasource/MediaSource.cpp:
+        (WebCore::MediaSource::monitorSourceBuffers): Protect against a SourceBuffer being removed
+            (and thus activeSourceBuffers being empty) when monitoring source buffer state.
+        * Modules/mediasource/SourceBuffer.cpp:
+        (WebCore::SourceBuffer::appendBufferTimerFired): Protect against SourceBuffer being removed.
+        (WebCore::SourceBuffer::videoTracks): Ditto.
+        (WebCore::SourceBuffer::audioTracks): Ditto.
+        (WebCore::SourceBuffer::textTracks): Ditto.
+        (WebCore::SourceBuffer::setActive): Ditto.
+        (WebCore::SourceBuffer::sourceBufferPrivateDidEndStream): Ditto.
+        (WebCore::SourceBuffer::hasCurrentTime): Ditto.
+        (WebCore::SourceBuffer::canPlayThrough): Ditto.
+        (WebCore::SourceBuffer::hasFutureTime): Ditto, and check for an empty buffered ranges.
+
 2014-03-17  Tim Horton  <[email protected]>
 
         WKThumbnailView should support snapshots

Modified: trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp (165750 => 165751)


--- trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp	2014-03-17 20:19:24 UTC (rev 165750)
+++ trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp	2014-03-17 20:23:36 UTC (rev 165751)
@@ -184,6 +184,13 @@
 {
     // 2.4.4 SourceBuffer Monitoring
     // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-source.html#buffer-monitoring
+
+    // Note, the behavior if activeSourceBuffers is empty is undefined.
+    if (!m_activeSourceBuffers) {
+        m_private->setReadyState(MediaPlayer::HaveNothing);
+        return;
+    }
+
     // ↳ If buffered for all objects in activeSourceBuffers do not contain TimeRanges for the current
     // playback position:
     auto begin = m_activeSourceBuffers->begin();

Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp (165750 => 165751)


--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp	2014-03-17 20:19:24 UTC (rev 165750)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp	2014-03-17 20:23:36 UTC (rev 165751)
@@ -408,6 +408,9 @@
 
 void SourceBuffer::appendBufferTimerFired(Timer<SourceBuffer>&)
 {
+    if (isRemoved())
+        return;
+
     ASSERT(m_updating);
 
     // Section 3.5.5 Buffer Append Algorithm
@@ -481,7 +484,7 @@
 
 VideoTrackList* SourceBuffer::videoTracks()
 {
-    if (!m_source->mediaElement())
+    if (!m_source || !m_source->mediaElement())
         return nullptr;
 
     if (!m_videoTracks)
@@ -492,7 +495,7 @@
 
 AudioTrackList* SourceBuffer::audioTracks()
 {
-    if (!m_source->mediaElement())
+    if (!m_source || !m_source->mediaElement())
         return nullptr;
 
     if (!m_audioTracks)
@@ -503,7 +506,7 @@
 
 TextTrackList* SourceBuffer::textTracks()
 {
-    if (!m_source->mediaElement())
+    if (!m_source || !m_source->mediaElement())
         return nullptr;
 
     if (!m_textTracks)
@@ -519,12 +522,14 @@
 
     m_active = active;
     m_private->setActive(active);
-    m_source->sourceBufferDidChangeAcitveState(this, active);
+    if (!isRemoved())
+        m_source->sourceBufferDidChangeAcitveState(this, active);
 }
 
 void SourceBuffer::sourceBufferPrivateDidEndStream(SourceBufferPrivate*, const WTF::AtomicString& error)
 {
-    m_source->endOfStream(error, IgnorableExceptionCode());
+    if (!isRemoved())
+        m_source->endOfStream(error, IgnorableExceptionCode());
 }
 
 void SourceBuffer::sourceBufferPrivateDidReceiveInitializationSegment(SourceBufferPrivate*, const InitializationSegment& segment)
@@ -1201,7 +1206,7 @@
 
 bool SourceBuffer::hasCurrentTime() const
 {
-    if (!m_buffered->length())
+    if (isRemoved() || !m_buffered->length())
         return false;
 
     double currentTime = m_source->currentTime();
@@ -1210,8 +1215,14 @@
 
 bool SourceBuffer::hasFutureTime() const
 {
+    if (isRemoved())
+        return false;
+
     double currentTime = m_source->currentTime();
     const PlatformTimeRanges& ranges = m_buffered->ranges();
+    if (!ranges.length())
+        return false;
+
     double nearest = m_buffered->nearest(m_source->currentTime());
     if (fabs(m_buffered->nearest(m_source->currentTime()) - currentTime) > CurrentTimeFudgeFactor)
         return false;
@@ -1225,6 +1236,9 @@
 
 bool SourceBuffer::canPlayThrough()
 {
+    if (isRemoved())
+        return false;
+
     monitorBufferingRate();
 
     // Assuming no fluctuations in the buffering rate, loading 1 second per second or greater
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to