Title: [255161] trunk/Source/WebCore
Revision
255161
Author
[email protected]
Date
2020-01-27 12:29:14 -0800 (Mon, 27 Jan 2020)

Log Message

Crash in WebCore::HTMLMediaElement::detachMediaSource()
https://bugs.webkit.org/show_bug.cgi?id=206766

Reviewed by Jer Noble.

Use WeakPtr<HTMLMediaElement> in MediaSource instead of a raw pointer.
In addition, we need to detach a MediaSource from an HTMLMediaElement before the HTMLMediaElement forgets the reference to the MediaSource.

* Modules/mediasource/MediaSource.cpp:
(WebCore::MediaSource::attachToElement):
* Modules/mediasource/MediaSource.h:
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::loadResource):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (255160 => 255161)


--- trunk/Source/WebCore/ChangeLog	2020-01-27 20:18:45 UTC (rev 255160)
+++ trunk/Source/WebCore/ChangeLog	2020-01-27 20:29:14 UTC (rev 255161)
@@ -1,3 +1,19 @@
+2020-01-27  Peng Liu  <[email protected]>
+
+        Crash in WebCore::HTMLMediaElement::detachMediaSource()
+        https://bugs.webkit.org/show_bug.cgi?id=206766
+
+        Reviewed by Jer Noble.
+
+        Use WeakPtr<HTMLMediaElement> in MediaSource instead of a raw pointer.
+        In addition, we need to detach a MediaSource from an HTMLMediaElement before the HTMLMediaElement forgets the reference to the MediaSource.
+
+        * Modules/mediasource/MediaSource.cpp:
+        (WebCore::MediaSource::attachToElement):
+        * Modules/mediasource/MediaSource.h:
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::loadResource):
+
 2020-01-27  Said Abou-Hallawa  <[email protected]>
 
         Throttling requestAnimationFrame should be controlled by RenderingUpdateScheduler

Modified: trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp (255160 => 255161)


--- trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp	2020-01-27 20:18:45 UTC (rev 255160)
+++ trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp	2020-01-27 20:29:14 UTC (rev 255161)
@@ -956,7 +956,7 @@
 
     ASSERT(isClosed());
 
-    m_mediaElement = &element;
+    m_mediaElement = makeWeakPtr(&element);
     return true;
 }
 

Modified: trunk/Source/WebCore/Modules/mediasource/MediaSource.h (255160 => 255161)


--- trunk/Source/WebCore/Modules/mediasource/MediaSource.h	2020-01-27 20:18:45 UTC (rev 255160)
+++ trunk/Source/WebCore/Modules/mediasource/MediaSource.h	2020-01-27 20:29:14 UTC (rev 255161)
@@ -36,14 +36,15 @@
 #include "EventTarget.h"
 #include "ExceptionOr.h"
 #include "GenericEventQueue.h"
+#include "HTMLMediaElement.h"
 #include "MediaSourcePrivateClient.h"
 #include "URLRegistry.h"
 #include <wtf/LoggerHelper.h>
+#include <wtf/WeakPtr.h>
 
 namespace WebCore {
 
 class ContentType;
-class HTMLMediaElement;
 class SourceBuffer;
 class SourceBufferList;
 class SourceBufferPrivate;
@@ -97,7 +98,7 @@
     ReadyState readyState() const { return m_readyState; }
     ExceptionOr<void> endOfStream(Optional<EndOfStreamError>);
 
-    HTMLMediaElement* mediaElement() const { return m_mediaElement; }
+    HTMLMediaElement* mediaElement() const { return m_mediaElement.get(); }
 
     SourceBufferList* sourceBuffers() { return m_sourceBuffers.get(); }
     SourceBufferList* activeSourceBuffers() { return m_activeSourceBuffers.get(); }
@@ -161,7 +162,7 @@
     RefPtr<SourceBufferList> m_activeSourceBuffers;
     mutable std::unique_ptr<PlatformTimeRanges> m_buffered;
     std::unique_ptr<PlatformTimeRanges> m_liveSeekable;
-    HTMLMediaElement* m_mediaElement { nullptr };
+    WeakPtr<HTMLMediaElement> m_mediaElement;
     MediaTime m_duration;
     MediaTime m_pendingSeekTime;
     ReadyState m_readyState { ReadyState::Closed };

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (255160 => 255161)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2020-01-27 20:18:45 UTC (rev 255160)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2020-01-27 20:29:14 UTC (rev 255161)
@@ -1535,11 +1535,16 @@
         loadAttempted = true;
 
         ALWAYS_LOG(LOGIDENTIFIER, "loading MSE blob");
-        if (!m_mediaSource->attachToElement(*this) || !m_player->load(url, contentType, m_mediaSource.get())) {
+        if (!m_mediaSource->attachToElement(*this)) {
             // Forget our reference to the MediaSource, so we leave it alone
             // while processing remainder of load failure.
             m_mediaSource = nullptr;
             mediaLoadingFailed(MediaPlayer::NetworkState::FormatError);
+        } else if (!m_player->load(url, contentType, m_mediaSource.get())) {
+            // We have to detach the MediaSource before we forget the reference to it.
+            m_mediaSource->detachFromElement(*this);
+            m_mediaSource = nullptr;
+            mediaLoadingFailed(MediaPlayer::NetworkState::FormatError);
         }
     }
 #endif
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to