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