Title: [264119] trunk/Source/WebKit
Revision
264119
Author
[email protected]
Date
2020-07-08 11:15:07 -0700 (Wed, 08 Jul 2020)

Log Message

Network process crashes in WebKit::WebIDBServer::removeConnection
https://bugs.webkit.org/show_bug.cgi?id=214071
<rdar://problem/64853929>

Patch by Sihui Liu <[email protected]> on 2020-07-08
Reviewed by Chris Dumez.

In network process, WebIDBServer may be removed and destroyed before web process using the same session
disconnects. Then a new WebIDBServer can be added before disconnection of web process and the new WebIDBServer
does not have information about the web process connection.

To solve this issue, now we only remove WebIDBServer when session is destroyed and there is no web process
connection of that session.

* NetworkProcess/IndexedDB/WebIDBServer.h:
* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::createNetworkConnectionToWebProcess):
(WebKit::NetworkProcess::destroySession):
(WebKit::NetworkProcess::removeWebIDBServerIfPossible):
(WebKit::NetworkProcess::connectionToWebProcessClosed):
* NetworkProcess/NetworkProcess.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (264118 => 264119)


--- trunk/Source/WebKit/ChangeLog	2020-07-08 18:03:21 UTC (rev 264118)
+++ trunk/Source/WebKit/ChangeLog	2020-07-08 18:15:07 UTC (rev 264119)
@@ -1,3 +1,26 @@
+2020-07-08  Sihui Liu  <[email protected]>
+
+        Network process crashes in WebKit::WebIDBServer::removeConnection
+        https://bugs.webkit.org/show_bug.cgi?id=214071
+        <rdar://problem/64853929>
+
+        Reviewed by Chris Dumez.
+
+        In network process, WebIDBServer may be removed and destroyed before web process using the same session 
+        disconnects. Then a new WebIDBServer can be added before disconnection of web process and the new WebIDBServer 
+        does not have information about the web process connection.
+
+        To solve this issue, now we only remove WebIDBServer when session is destroyed and there is no web process 
+        connection of that session.
+
+        * NetworkProcess/IndexedDB/WebIDBServer.h:
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::createNetworkConnectionToWebProcess):
+        (WebKit::NetworkProcess::destroySession):
+        (WebKit::NetworkProcess::removeWebIDBServerIfPossible):
+        (WebKit::NetworkProcess::connectionToWebProcessClosed):
+        * NetworkProcess/NetworkProcess.h:
+
 2020-07-08  Andy Estes  <[email protected]>
 
         REGRESSION (r207558): [Mac] Context clicks on links sometimes result in navigations

Modified: trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h (264118 => 264119)


--- trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h	2020-07-08 18:03:21 UTC (rev 264118)
+++ trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h	2020-07-08 18:15:07 UTC (rev 264119)
@@ -89,6 +89,7 @@
     void dispatchToThread(WTF::Function<void()>&&);
     void close();
 
+    bool hasConnection() const { return !m_connections.isEmpty(); }
 private:
     WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&);
     ~WebIDBServer();

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (264118 => 264119)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-07-08 18:03:21 UTC (rev 264118)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-07-08 18:15:07 UTC (rev 264119)
@@ -415,7 +415,9 @@
 
     m_storageManagerSet->addConnection(connection.connection());
 
+#if ENABLE(INDEXED_DATABASE)
     webIDBServer(sessionID).addConnection(connection.connection(), identifier);
+#endif
 }
 
 void NetworkProcess::clearCachedCredentials()
@@ -596,8 +598,10 @@
 #endif
 
     m_storageManagerSet->remove(sessionID);
-    if (auto webIDBServer = m_webIDBServers.take(sessionID))
-        webIDBServer->close();
+
+#if ENABLE(INDEXED_DATABASE)
+    removeWebIDBServerIfPossible(sessionID);
+#endif
 }
 
 #if ENABLE(RESOURCE_LOAD_STATISTICS)
@@ -2506,6 +2510,24 @@
     sessionStorageQuotaManager->setIDBRootPath(idbRootPath);
 }
 
+void NetworkProcess::removeWebIDBServerIfPossible(PAL::SessionID sessionID)
+{
+    ASSERT(RunLoop::isMain());
+
+    auto iterator = m_webIDBServers.find(sessionID);
+    if (iterator == m_webIDBServers.end())
+        return;
+
+    if (m_networkSessions.contains(sessionID))
+        return;
+
+    if (iterator->value->hasConnection())
+        return;
+
+    iterator->value->close();
+    m_webIDBServers.remove(iterator);
+}
+
 #endif // ENABLE(INDEXED_DATABASE)
 
 void NetworkProcess::syncLocalStorage(CompletionHandler<void()>&& completionHandler)
@@ -2737,8 +2759,13 @@
 void NetworkProcess::connectionToWebProcessClosed(IPC::Connection& connection, PAL::SessionID sessionID)
 {
     m_storageManagerSet->removeConnection(connection);
-    if (auto* webIDBServer = m_webIDBServers.get(sessionID))
-        webIDBServer->removeConnection(connection);
+
+#if ENABLE(INDEXED_DATABASE)
+    auto* webIDBServer = m_webIDBServers.get(sessionID);
+    ASSERT(webIDBServer);
+    webIDBServer->removeConnection(connection);
+    removeWebIDBServerIfPossible(sessionID);
+#endif
 }
 
 NetworkConnectionToWebProcess* NetworkProcess::webProcessConnection(ProcessIdentifier identifier) const

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (264118 => 264119)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2020-07-08 18:03:21 UTC (rev 264118)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2020-07-08 18:15:07 UTC (rev 264119)
@@ -463,6 +463,7 @@
     HashSet<WebCore::SecurityOriginData> indexedDatabaseOrigins(const String& path);
     Ref<WebIDBServer> createWebIDBServer(PAL::SessionID);
     void setSessionStorageQuotaManagerIDBRootPath(PAL::SessionID, const String& idbRootPath);
+    void removeWebIDBServerIfPossible(PAL::SessionID);
 #endif
 
 #if ENABLE(SERVICE_WORKER)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to