Title: [198549] trunk/Source/WebCore
Revision
198549
Author
[email protected]
Date
2016-03-22 13:56:38 -0700 (Tue, 22 Mar 2016)

Log Message

CRASH in WebCore::MediaResourceLoader::requestResource + 698
https://bugs.webkit.org/show_bug.cgi?id=155651
<rdar://problem/25130582>

Reviewed by Eric Carlson.

No new tests, fixes existing tests running under GuardMalloc.

Protect against the Document passed into MediaResourceLoader being destroyed during the MediaResourceLoader's lifetime.

* loader/MediaResourceLoader.cpp:
(WebCore::MediaResourceLoader::MediaResourceLoader):
(WebCore::MediaResourceLoader::contextDestroyed):
(WebCore::MediaResourceLoader::requestResource):
(WebCore::MediaResource::responseReceived):
* loader/MediaResourceLoader.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (198548 => 198549)


--- trunk/Source/WebCore/ChangeLog	2016-03-22 20:29:40 UTC (rev 198548)
+++ trunk/Source/WebCore/ChangeLog	2016-03-22 20:56:38 UTC (rev 198549)
@@ -1,3 +1,22 @@
+2016-03-18  Jer Noble  <[email protected]>
+
+        CRASH in WebCore::MediaResourceLoader::requestResource + 698
+        https://bugs.webkit.org/show_bug.cgi?id=155651
+        <rdar://problem/25130582>
+
+        Reviewed by Eric Carlson.
+
+        No new tests, fixes existing tests running under GuardMalloc.
+
+        Protect against the Document passed into MediaResourceLoader being destroyed during the MediaResourceLoader's lifetime.
+
+        * loader/MediaResourceLoader.cpp:
+        (WebCore::MediaResourceLoader::MediaResourceLoader):
+        (WebCore::MediaResourceLoader::contextDestroyed):
+        (WebCore::MediaResourceLoader::requestResource):
+        (WebCore::MediaResource::responseReceived):
+        * loader/MediaResourceLoader.h:
+
 2016-03-22  Beth Dakin  <[email protected]>
 
         Advanced spell checking should be guarded behind 

Modified: trunk/Source/WebCore/loader/MediaResourceLoader.cpp (198548 => 198549)


--- trunk/Source/WebCore/loader/MediaResourceLoader.cpp	2016-03-22 20:29:40 UTC (rev 198548)
+++ trunk/Source/WebCore/loader/MediaResourceLoader.cpp	2016-03-22 20:56:38 UTC (rev 198549)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2014 Igalia S.L
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -39,7 +40,8 @@
 namespace WebCore {
 
 MediaResourceLoader::MediaResourceLoader(Document& document, const String& crossOriginMode)
-    : m_document(document)
+    : ContextDestructionObserver(&document)
+    , m_document(&document)
     , m_crossOriginMode(crossOriginMode)
 {
 }
@@ -49,8 +51,17 @@
     ASSERT(m_resources.isEmpty());
 }
 
+void MediaResourceLoader::contextDestroyed()
+{
+    ContextDestructionObserver::contextDestroyed();
+    m_document = nullptr;
+}
+
 RefPtr<PlatformMediaResource> MediaResourceLoader::requestResource(const ResourceRequest& request, LoadOptions options)
 {
+    if (!m_document)
+        return nullptr;
+
     DataBufferingPolicy bufferingPolicy = options & LoadOption::BufferData ? WebCore::BufferData : WebCore::DoNotBufferData;
     RequestOriginPolicy corsPolicy = !m_crossOriginMode.isNull() ? PotentiallyCrossOriginEnabled : UseDefaultOriginRestrictionsForType;
     StoredCredentials allowCredentials = m_crossOriginMode.isNull() || equalLettersIgnoringASCIICase(m_crossOriginMode, "use-credentials") ? AllowStoredCredentials : DoNotAllowStoredCredentials;
@@ -60,9 +71,9 @@
     CachedResourceRequest cacheRequest(request, ResourceLoaderOptions(SendCallbacks, DoNotSniffContent, bufferingPolicy, allowCredentials, DoNotAskClientForCrossOriginCredentials, ClientDidNotRequestCredentials, DoSecurityCheck, corsPolicy, DoNotIncludeCertificateInfo, ContentSecurityPolicyImposition::DoPolicyCheck, DefersLoadingPolicy::AllowDefersLoading, CachingPolicy::AllowCaching));
 
     if (!m_crossOriginMode.isNull())
-        updateRequestForAccessControl(cacheRequest.mutableResourceRequest(), m_document.securityOrigin(), allowCredentials);
+        updateRequestForAccessControl(cacheRequest.mutableResourceRequest(), m_document->securityOrigin(), allowCredentials);
 
-    CachedResourceHandle<CachedRawResource> resource = m_document.cachedResourceLoader().requestMedia(cacheRequest);
+    CachedResourceHandle<CachedRawResource> resource = m_document->cachedResourceLoader().requestMedia(cacheRequest);
     if (!resource)
         return nullptr;
 
@@ -116,10 +127,13 @@
 {
     ASSERT_UNUSED(resource, resource == m_resource);
 
+    if (!m_loader->document())
+        return;
+
     RefPtr<MediaResource> protect(this);
-    if (!m_loader->crossOriginMode().isNull() && !resource->passesSameOriginPolicyCheck(*m_loader->document().securityOrigin())) {
+    if (!m_loader->crossOriginMode().isNull() && !resource->passesSameOriginPolicyCheck(*m_loader->document()->securityOrigin())) {
         static NeverDestroyed<const String> consoleMessage("Cross-origin media resource load denied by Cross-Origin Resource Sharing policy.");
-        m_loader->document().addConsoleMessage(MessageSource::Security, MessageLevel::Error, consoleMessage.get());
+        m_loader->document()->addConsoleMessage(MessageSource::Security, MessageLevel::Error, consoleMessage.get());
         m_didPassAccessControlCheck = false;
         if (m_client)
             m_client->accessControlCheckFailed(*this, ResourceError(errorDomainWebKitInternal, 0, response.url(), consoleMessage.get()));

Modified: trunk/Source/WebCore/loader/MediaResourceLoader.h (198548 => 198549)


--- trunk/Source/WebCore/loader/MediaResourceLoader.h	2016-03-22 20:29:40 UTC (rev 198548)
+++ trunk/Source/WebCore/loader/MediaResourceLoader.h	2016-03-22 20:56:38 UTC (rev 198549)
@@ -29,6 +29,7 @@
 #if ENABLE(VIDEO)
 #include "CachedRawResourceClient.h"
 #include "CachedResourceHandle.h"
+#include "ContextDestructionObserver.h"
 #include "PlatformMediaResourceLoader.h"
 #include <wtf/HashSet.h>
 #include <wtf/Ref.h>
@@ -40,7 +41,7 @@
 class Document;
 class MediaResource;
 
-class MediaResourceLoader final : public PlatformMediaResourceLoader {
+class MediaResourceLoader final : public PlatformMediaResourceLoader, public ContextDestructionObserver {
 public:
     WEBCORE_EXPORT MediaResourceLoader(Document&, const String& crossOriginMode);
     WEBCORE_EXPORT virtual ~MediaResourceLoader();
@@ -48,11 +49,13 @@
     RefPtr<PlatformMediaResource> requestResource(const ResourceRequest&, LoadOptions) override;
     void removeResource(MediaResource&);
 
-    Document& document() { return m_document; }
+    Document* document() { return m_document; }
     const String& crossOriginMode() const { return m_crossOriginMode; }
 
 private:
-    Document& m_document;
+    void contextDestroyed() override;
+
+    Document* m_document;
     String m_crossOriginMode;
     HashSet<MediaResource*> m_resources;
 };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to