Crash under SWServer::unregisterServiceWorkerClient()
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Jun 2018 21:43:41 +0000 (21:43 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Jun 2018 21:43:41 +0000 (21:43 +0000)
https://bugs.webkit.org/show_bug.cgi?id=187115
<rdar://problem/41539197>

Reviewed by Youenn Fablet.

Connections are usually destroyed before their SWServer. However, as per crash traces, it is possible
for SWServers to get destroyed while they still have connections. When this happens, the connections
(which are owned by the SWServer) get destroyed with other SWServer data members. In turn, the
connection destructor tries to unregister its clients from the server that is currently being destroyed.

To address the issue, the SWServer destructor now destroys remaining connections early, before SWServer's
other data members get destroyed.

* workers/service/server/SWServer.cpp:
(WebCore::SWServer::~SWServer):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233279 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/workers/service/server/SWServer.cpp

index e99eb0b..298b127 100644 (file)
@@ -1,3 +1,22 @@
+2018-06-27  Chris Dumez  <cdumez@apple.com>
+
+        Crash under SWServer::unregisterServiceWorkerClient()
+        https://bugs.webkit.org/show_bug.cgi?id=187115
+        <rdar://problem/41539197>
+
+        Reviewed by Youenn Fablet.
+
+        Connections are usually destroyed before their SWServer. However, as per crash traces, it is possible
+        for SWServers to get destroyed while they still have connections. When this happens, the connections
+        (which are owned by the SWServer) get destroyed with other SWServer data members. In turn, the
+        connection destructor tries to unregister its clients from the server that is currently being destroyed.
+
+        To address the issue, the SWServer destructor now destroys remaining connections early, before SWServer's
+        other data members get destroyed.
+
+        * workers/service/server/SWServer.cpp:
+        (WebCore::SWServer::~SWServer):
+
 2018-06-27  Youenn Fablet  <youenn@apple.com>
 
         NetworkLoadChecker should not need to hard ref NetworkConnectionToWebProcess
index 714fd38..74391a0 100644 (file)
@@ -64,6 +64,10 @@ HashSet<SWServer*>& SWServer::allServers()
 
 SWServer::~SWServer()
 {
+    // Destroy the remaining connections before the SWServer gets destroyed since they have a raw pointer
+    // to the server and since they try to unregister clients from the server in their destructor.
+    m_connections.clear();
+
     allServers().remove(this);
 }