Title: [240974] trunk/Source/WebKit
Revision
240974
Author
[email protected]
Date
2019-02-05 07:38:20 -0800 (Tue, 05 Feb 2019)

Log Message

Protect globalWebSocketStreamMap with a Lock
https://bugs.webkit.org/show_bug.cgi?id=194224
<rdar://problem/47581081>

Reviewed by Ryosuke Niwa.

* WebProcess/Network/WebSocketStream.cpp:
(WebKit::WebSocketStream::streamWithIdentifier):
(WebKit::WebSocketStream::networkProcessCrashed):
(WebKit::WebSocketStream::WebSocketStream):
(WebKit::WebSocketStream::~WebSocketStream):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (240973 => 240974)


--- trunk/Source/WebKit/ChangeLog	2019-02-05 15:36:02 UTC (rev 240973)
+++ trunk/Source/WebKit/ChangeLog	2019-02-05 15:38:20 UTC (rev 240974)
@@ -1,3 +1,17 @@
+2019-02-05  Alex Christensen  <[email protected]>
+
+        Protect globalWebSocketStreamMap with a Lock
+        https://bugs.webkit.org/show_bug.cgi?id=194224
+        <rdar://problem/47581081>
+
+        Reviewed by Ryosuke Niwa.
+
+        * WebProcess/Network/WebSocketStream.cpp:
+        (WebKit::WebSocketStream::streamWithIdentifier):
+        (WebKit::WebSocketStream::networkProcessCrashed):
+        (WebKit::WebSocketStream::WebSocketStream):
+        (WebKit::WebSocketStream::~WebSocketStream):
+
 2019-02-04  Alex Christensen  <[email protected]>
 
         Add Networking Daemon skeleton

Modified: trunk/Source/WebKit/WebProcess/Network/WebSocketStream.cpp (240973 => 240974)


--- trunk/Source/WebKit/WebProcess/Network/WebSocketStream.cpp	2019-02-05 15:36:02 UTC (rev 240973)
+++ trunk/Source/WebKit/WebProcess/Network/WebSocketStream.cpp	2019-02-05 15:38:20 UTC (rev 240974)
@@ -41,6 +41,7 @@
 namespace WebKit {
 using namespace WebCore;
 
+static Lock globalWebSocketStreamMapLock;
 static HashMap<uint64_t, WebSocketStream*>& globalWebSocketStreamMap()
 {
     static NeverDestroyed<HashMap<uint64_t, WebSocketStream*>> globalMap;
@@ -49,19 +50,30 @@
 
 WebSocketStream* WebSocketStream::streamWithIdentifier(uint64_t identifier)
 {
+    LockHolder locker(globalWebSocketStreamMapLock);
     return globalWebSocketStreamMap().get(identifier);
 }
 
 void WebSocketStream::networkProcessCrashed()
 {
-    for (auto& stream : globalWebSocketStreamMap().values()) {
+    Vector<RefPtr<WebSocketStream>> sockets;
+    {
+        LockHolder locker(globalWebSocketStreamMapLock);
+        sockets.reserveInitialCapacity(globalWebSocketStreamMap().size());
+        for (auto& stream : globalWebSocketStreamMap().values())
+            sockets.uncheckedAppend(stream);
+    }
+
+    for (auto& stream : sockets) {
         for (auto& callback : stream->m_sendDataCallbacks.values())
             callback(false);
         for (auto& callback : stream->m_sendHandshakeCallbacks.values())
             callback(false, false);
         stream->m_client.didFailSocketStream(*stream, SocketStreamError(0, { }, "Network process crashed."));
+        stream = nullptr;
     }
 
+    LockHolder locker(globalWebSocketStreamMapLock);
     globalWebSocketStreamMap().clear();
 }
 
@@ -76,6 +88,7 @@
 {
     WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::CreateSocketStream(url, sessionID, cachePartition, identifier()), 0);
 
+    LockHolder locker(globalWebSocketStreamMapLock);
     ASSERT(!globalWebSocketStreamMap().contains(identifier()));
     globalWebSocketStreamMap().set(identifier(), this);
 }
@@ -82,6 +95,7 @@
 
 WebSocketStream::~WebSocketStream()
 {
+    LockHolder locker(globalWebSocketStreamMapLock);
     ASSERT(globalWebSocketStreamMap().contains(identifier()));
     globalWebSocketStreamMap().remove(identifier());
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to