Title: [149121] trunk/Source/WebKit2
Revision
149121
Author
[email protected]
Date
2013-04-25 10:59:07 -0700 (Thu, 25 Apr 2013)

Log Message

Thread safety issues in WKCustomProtocol.
<rdar://problem/13247304> and https://bugs.webkit.org/show_bug.cgi?id=115185

Reviewed by Alexey Proskuryakov.

* Shared/Network/CustomProtocols/CustomProtocolManager.h:

* Shared/Network/CustomProtocols/mac/CustomProtocolManagerMac.mm:
(WebKit::CustomProtocolManager::addCustomProtocol): Protect m_customProtocolMap with its mutex.
(WebKit::CustomProtocolManager::removeCustomProtocol): Ditto.
(WebKit::CustomProtocolManager::didFailWithError):
(WebKit::CustomProtocolManager::didLoadData):
(WebKit::CustomProtocolManager::didReceiveResponse):
(WebKit::CustomProtocolManager::didFinishLoading):
(WebKit::CustomProtocolManager::protocolForID): Protect m_customProtocolMap with its mutex, and return
  a RetainPtr instead of a raw pointer.

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (149120 => 149121)


--- trunk/Source/WebKit2/ChangeLog	2013-04-25 17:48:58 UTC (rev 149120)
+++ trunk/Source/WebKit2/ChangeLog	2013-04-25 17:59:07 UTC (rev 149121)
@@ -1,3 +1,22 @@
+2013-04-25  Brady Eidson  <[email protected]>
+
+        Thread safety issues in WKCustomProtocol.
+        <rdar://problem/13247304> and https://bugs.webkit.org/show_bug.cgi?id=115185
+
+        Reviewed by Alexey Proskuryakov.
+
+        * Shared/Network/CustomProtocols/CustomProtocolManager.h:
+
+        * Shared/Network/CustomProtocols/mac/CustomProtocolManagerMac.mm:
+        (WebKit::CustomProtocolManager::addCustomProtocol): Protect m_customProtocolMap with its mutex.
+        (WebKit::CustomProtocolManager::removeCustomProtocol): Ditto.
+        (WebKit::CustomProtocolManager::didFailWithError):
+        (WebKit::CustomProtocolManager::didLoadData):
+        (WebKit::CustomProtocolManager::didReceiveResponse):
+        (WebKit::CustomProtocolManager::didFinishLoading):
+        (WebKit::CustomProtocolManager::protocolForID): Protect m_customProtocolMap with its mutex, and return
+          a RetainPtr instead of a raw pointer.
+
 2013-04-25  Jer Noble  <[email protected]>
 
         Further build fixes: correct two more misnames of WebProcessShim.dyld.

Modified: trunk/Source/WebKit2/Shared/Network/CustomProtocols/CustomProtocolManager.h (149120 => 149121)


--- trunk/Source/WebKit2/Shared/Network/CustomProtocols/CustomProtocolManager.h	2013-04-25 17:48:58 UTC (rev 149120)
+++ trunk/Source/WebKit2/Shared/Network/CustomProtocols/CustomProtocolManager.h	2013-04-25 17:59:07 UTC (rev 149121)
@@ -32,6 +32,7 @@
 #include "NetworkProcessSupplement.h"
 #include "WebProcessSupplement.h"
 #include <wtf/HashSet.h>
+#include <wtf/Threading.h>
 #include <wtf/text/WTFString.h>
 
 #if PLATFORM(MAC)
@@ -96,7 +97,11 @@
 #if PLATFORM(MAC)
     typedef HashMap<uint64_t, RetainPtr<WKCustomProtocol> > CustomProtocolMap;
     CustomProtocolMap m_customProtocolMap;
-    WKCustomProtocol *protocolForID(uint64_t customProtocolID);
+    Mutex m_customProtocolMapMutex;
+    
+    // WKCustomProtocol objects can be removed from the m_customProtocolMap from multiple threads.
+    // We return a RetainPtr here because it is unsafe to return a raw pointer since the object might immediately be destroyed from a different thread.
+    RetainPtr<WKCustomProtocol> protocolForID(uint64_t customProtocolID);
 #endif
 };
 

Modified: trunk/Source/WebKit2/Shared/Network/CustomProtocols/mac/CustomProtocolManagerMac.mm (149120 => 149121)


--- trunk/Source/WebKit2/Shared/Network/CustomProtocols/mac/CustomProtocolManagerMac.mm	2013-04-25 17:48:58 UTC (rev 149120)
+++ trunk/Source/WebKit2/Shared/Network/CustomProtocols/mac/CustomProtocolManagerMac.mm	2013-04-25 17:59:07 UTC (rev 149121)
@@ -150,12 +150,14 @@
 void CustomProtocolManager::addCustomProtocol(WKCustomProtocol *customProtocol)
 {
     ASSERT(customProtocol);
+    MutexLocker locker(m_customProtocolMapMutex);
     m_customProtocolMap.add(customProtocol.customProtocolID, customProtocol);
 }
 
 void CustomProtocolManager::removeCustomProtocol(WKCustomProtocol *customProtocol)
 {
     ASSERT(customProtocol);
+    MutexLocker locker(m_customProtocolMapMutex);
     m_customProtocolMap.remove(customProtocol.customProtocolID);
 }
     
@@ -176,50 +178,52 @@
 
 void CustomProtocolManager::didFailWithError(uint64_t customProtocolID, const WebCore::ResourceError& error)
 {
-    WKCustomProtocol *protocol = protocolForID(customProtocolID);
+    RetainPtr<WKCustomProtocol> protocol = protocolForID(customProtocolID);
     if (!protocol)
         return;
-    
-    [[protocol client] URLProtocol:protocol didFailWithError:error.nsError()];
-    removeCustomProtocol(protocol);
+
+    [[protocol.get() client] URLProtocol:protocol.get() didFailWithError:error.nsError()];
+    removeCustomProtocol(protocol.get());
 }
 
 void CustomProtocolManager::didLoadData(uint64_t customProtocolID, const CoreIPC::DataReference& data)
 {
-    WKCustomProtocol *protocol = protocolForID(customProtocolID);
+    RetainPtr<WKCustomProtocol> protocol = protocolForID(customProtocolID);
     if (!protocol)
         return;
     
-    [[protocol client] URLProtocol:protocol didLoadData:[NSData dataWithBytes:(void*)data.data() length:data.size()]];
+    [[protocol.get() client] URLProtocol:protocol.get() didLoadData:[NSData dataWithBytes:(void*)data.data() length:data.size()]];
 }
 
 void CustomProtocolManager::didReceiveResponse(uint64_t customProtocolID, const WebCore::ResourceResponse& response, uint32_t cacheStoragePolicy)
 {
-    WKCustomProtocol *protocol = protocolForID(customProtocolID);
+    RetainPtr<WKCustomProtocol> protocol = protocolForID(customProtocolID);
     if (!protocol)
         return;
     
-    [[protocol client] URLProtocol:protocol didReceiveResponse:response.nsURLResponse() cacheStoragePolicy:static_cast<NSURLCacheStoragePolicy>(cacheStoragePolicy)];
+    [[protocol.get() client] URLProtocol:protocol.get() didReceiveResponse:response.nsURLResponse() cacheStoragePolicy:static_cast<NSURLCacheStoragePolicy>(cacheStoragePolicy)];
 }
 
 void CustomProtocolManager::didFinishLoading(uint64_t customProtocolID)
 {
-    WKCustomProtocol *protocol = protocolForID(customProtocolID);
+    RetainPtr<WKCustomProtocol> protocol = protocolForID(customProtocolID);
     if (!protocol)
         return;
     
-    [[protocol client] URLProtocolDidFinishLoading:protocol];
-    removeCustomProtocol(protocol);
+    [[protocol.get() client] URLProtocolDidFinishLoading:protocol.get()];
+    removeCustomProtocol(protocol.get());
 }
 
-WKCustomProtocol *CustomProtocolManager::protocolForID(uint64_t customProtocolID)
+RetainPtr<WKCustomProtocol> CustomProtocolManager::protocolForID(uint64_t customProtocolID)
 {
+    MutexLocker locker(m_customProtocolMapMutex);
+
     CustomProtocolMap::const_iterator it = m_customProtocolMap.find(customProtocolID);
     if (it == m_customProtocolMap.end())
         return nil;
     
     ASSERT(it->value);
-    return it->value.get();
+    return it->value;
 }
 
 } // namespace WebKit
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to