Title: [222684] trunk/Source/WebKit
Revision
222684
Author
[email protected]
Date
2017-09-30 15:50:16 -0700 (Sat, 30 Sep 2017)

Log Message

Have IPC::Connection::Client objects consistently invalidate the connection when destroyed
https://bugs.webkit.org/show_bug.cgi?id=177708

Reviewed by Anders Carlsson.

I ran into an intermittent crash when running regression tests. It looked like a connection
client was being called after it was destroyed. I did an audit of the all the connection
clients to make sure they all invalidate their connection before they are destroyed.

* NetworkProcess/NetworkConnectionToWebProcess.cpp:
(WebKit::NetworkConnectionToWebProcess::~NetworkConnectionToWebProcess): Invalidate the
connection since this object opened the connection. There is no obvious
guarantee that the connection will already be invalid when this is destroyed.
* StorageProcess/StorageToWebProcessConnection.cpp:
(WebKit::StorageToWebProcessConnection::~StorageToWebProcessConnection): Ditto.
* UIProcess/Plugins/PluginProcessProxy.cpp:
(WebKit::PluginProcessProxy::~PluginProcessProxy): Ditto.
* WebProcess/Network/NetworkProcessConnection.cpp:
(WebKit::NetworkProcessConnection::~NetworkProcessConnection): Ditto.
* WebProcess/Storage/WebToStorageProcessConnection.cpp:
(WebKit::WebToStorageProcessConnection::~WebToStorageProcessConnection): Ditto.

* StorageProcess/StorageToWebProcessConnection.h: Derive privately rather than publicly
from IPC::Connection::Client because we can, and this means we don't have to study quite
as much code to understand how this is used as a connection client.
* WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h: Ditto.
* WebProcess/Storage/WebToStorageProcessConnection.h: Ditto.
* WebProcess/WebPage/WebInspector.h: Ditto.
* WebProcess/WebPage/WebInspectorUI.h: Ditto.

* WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:
(WebKit::WebIDBConnectionToServer::WebIDBConnectionToServer): Added a comment about a
reference cycle cycle leading to a leak that I believe exists here.

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (222683 => 222684)


--- trunk/Source/WebKit/ChangeLog	2017-09-30 21:25:50 UTC (rev 222683)
+++ trunk/Source/WebKit/ChangeLog	2017-09-30 22:50:16 UTC (rev 222684)
@@ -1,3 +1,39 @@
+2017-09-30  Darin Adler  <[email protected]>
+
+        Have IPC::Connection::Client objects consistently invalidate the connection when destroyed
+        https://bugs.webkit.org/show_bug.cgi?id=177708
+
+        Reviewed by Anders Carlsson.
+
+        I ran into an intermittent crash when running regression tests. It looked like a connection
+        client was being called after it was destroyed. I did an audit of the all the connection
+        clients to make sure they all invalidate their connection before they are destroyed.
+
+        * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+        (WebKit::NetworkConnectionToWebProcess::~NetworkConnectionToWebProcess): Invalidate the
+        connection since this object opened the connection. There is no obvious
+        guarantee that the connection will already be invalid when this is destroyed.
+        * StorageProcess/StorageToWebProcessConnection.cpp:
+        (WebKit::StorageToWebProcessConnection::~StorageToWebProcessConnection): Ditto.
+        * UIProcess/Plugins/PluginProcessProxy.cpp:
+        (WebKit::PluginProcessProxy::~PluginProcessProxy): Ditto.
+        * WebProcess/Network/NetworkProcessConnection.cpp:
+        (WebKit::NetworkProcessConnection::~NetworkProcessConnection): Ditto.
+        * WebProcess/Storage/WebToStorageProcessConnection.cpp:
+        (WebKit::WebToStorageProcessConnection::~WebToStorageProcessConnection): Ditto.
+
+        * StorageProcess/StorageToWebProcessConnection.h: Derive privately rather than publicly
+        from IPC::Connection::Client because we can, and this means we don't have to study quite
+        as much code to understand how this is used as a connection client.
+        * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h: Ditto.
+        * WebProcess/Storage/WebToStorageProcessConnection.h: Ditto.
+        * WebProcess/WebPage/WebInspector.h: Ditto.
+        * WebProcess/WebPage/WebInspectorUI.h: Ditto.
+
+        * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:
+        (WebKit::WebIDBConnectionToServer::WebIDBConnectionToServer): Added a comment about a
+        reference cycle cycle leading to a leak that I believe exists here.
+
 2017-09-29  Alex Christensen  <[email protected]>
 
         REGRESSION: ASSERTION FAILED: m_provisionalURL.isEmpty() in WebKit::FrameLoadState::didStartProvisionalLoad

Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (222683 => 222684)


--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp	2017-09-30 21:25:50 UTC (rev 222683)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp	2017-09-30 22:50:16 UTC (rev 222684)
@@ -77,6 +77,7 @@
 
 NetworkConnectionToWebProcess::~NetworkConnectionToWebProcess()
 {
+    m_connection->invalidate();
 #if USE(LIBWEBRTC)
     if (m_rtcProvider)
         m_rtcProvider->close();

Modified: trunk/Source/WebKit/StorageProcess/StorageToWebProcessConnection.cpp (222683 => 222684)


--- trunk/Source/WebKit/StorageProcess/StorageToWebProcessConnection.cpp	2017-09-30 21:25:50 UTC (rev 222683)
+++ trunk/Source/WebKit/StorageProcess/StorageToWebProcessConnection.cpp	2017-09-30 22:50:16 UTC (rev 222684)
@@ -53,7 +53,7 @@
 
 StorageToWebProcessConnection::~StorageToWebProcessConnection()
 {
-
+    m_connection->invalidate();
 }
 
 void StorageToWebProcessConnection::didReceiveMessage(IPC::Connection& connection, IPC::Decoder& decoder)

Modified: trunk/Source/WebKit/StorageProcess/StorageToWebProcessConnection.h (222683 => 222684)


--- trunk/Source/WebKit/StorageProcess/StorageToWebProcessConnection.h	2017-09-30 21:25:50 UTC (rev 222683)
+++ trunk/Source/WebKit/StorageProcess/StorageToWebProcessConnection.h	2017-09-30 22:50:16 UTC (rev 222684)
@@ -37,7 +37,7 @@
 class WebIDBConnectionToClient;
 class WebSWServerConnection;
 
-class StorageToWebProcessConnection : public RefCounted<StorageToWebProcessConnection>, public IPC::Connection::Client, public IPC::MessageSender {
+class StorageToWebProcessConnection : public RefCounted<StorageToWebProcessConnection>, private IPC::Connection::Client, private IPC::MessageSender {
 public:
     static Ref<StorageToWebProcessConnection> create(IPC::Connection::Identifier);
     ~StorageToWebProcessConnection();

Modified: trunk/Source/WebKit/UIProcess/Plugins/PluginProcessProxy.cpp (222683 => 222684)


--- trunk/Source/WebKit/UIProcess/Plugins/PluginProcessProxy.cpp	2017-09-30 21:25:50 UTC (rev 222683)
+++ trunk/Source/WebKit/UIProcess/Plugins/PluginProcessProxy.cpp	2017-09-30 22:50:16 UTC (rev 222684)
@@ -80,6 +80,9 @@
 
 PluginProcessProxy::~PluginProcessProxy()
 {
+    if (m_connection)
+        m_connection->invalidate();
+
     ASSERT(m_pendingFetchWebsiteDataRequests.isEmpty());
     ASSERT(m_pendingFetchWebsiteDataCallbacks.isEmpty());
     ASSERT(m_pendingDeleteWebsiteDataRequests.isEmpty());

Modified: trunk/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp (222683 => 222684)


--- trunk/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp	2017-09-30 21:25:50 UTC (rev 222683)
+++ trunk/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp	2017-09-30 22:50:16 UTC (rev 222684)
@@ -66,6 +66,8 @@
     relaxAdoptionRequirement();
 
     m_isOpenInServer = sendSync(Messages::StorageToWebProcessConnection::EstablishIDBConnectionToServer(sessionID), Messages::StorageToWebProcessConnection::EstablishIDBConnectionToServer::Reply(m_identifier));
+
+    // FIXME: This creates a reference cycle, so neither this object nor the IDBConnectionToServer will ever be deallocated.
     m_connectionToServer = IDBClient::IDBConnectionToServer::create(*this);
 }
 

Modified: trunk/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h (222683 => 222684)


--- trunk/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h	2017-09-30 21:25:50 UTC (rev 222683)
+++ trunk/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h	2017-09-30 22:50:16 UTC (rev 222684)
@@ -36,7 +36,7 @@
 
 class WebIDBResult;
 
-class WebIDBConnectionToServer final : public WebCore::IDBClient::IDBConnectionToServerDelegate, public IPC::MessageSender, public RefCounted<WebIDBConnectionToServer> {
+class WebIDBConnectionToServer final : private WebCore::IDBClient::IDBConnectionToServerDelegate, private IPC::MessageSender, public RefCounted<WebIDBConnectionToServer> {
 public:
     static Ref<WebIDBConnectionToServer> create(PAL::SessionID);
 

Modified: trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp (222683 => 222684)


--- trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp	2017-09-30 21:25:50 UTC (rev 222683)
+++ trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp	2017-09-30 22:50:16 UTC (rev 222684)
@@ -59,6 +59,7 @@
 
 NetworkProcessConnection::~NetworkProcessConnection()
 {
+    m_connection->invalidate();
 }
 
 void NetworkProcessConnection::didReceiveMessage(IPC::Connection& connection, IPC::Decoder& decoder)

Modified: trunk/Source/WebKit/WebProcess/Storage/WebToStorageProcessConnection.cpp (222683 => 222684)


--- trunk/Source/WebKit/WebProcess/Storage/WebToStorageProcessConnection.cpp	2017-09-30 21:25:50 UTC (rev 222683)
+++ trunk/Source/WebKit/WebProcess/Storage/WebToStorageProcessConnection.cpp	2017-09-30 22:50:16 UTC (rev 222684)
@@ -46,6 +46,7 @@
 
 WebToStorageProcessConnection::~WebToStorageProcessConnection()
 {
+    m_connection->invalidate();
 }
 
 void WebToStorageProcessConnection::didReceiveMessage(IPC::Connection& connection, IPC::Decoder& decoder)

Modified: trunk/Source/WebKit/WebProcess/Storage/WebToStorageProcessConnection.h (222683 => 222684)


--- trunk/Source/WebKit/WebProcess/Storage/WebToStorageProcessConnection.h	2017-09-30 21:25:50 UTC (rev 222683)
+++ trunk/Source/WebKit/WebProcess/Storage/WebToStorageProcessConnection.h	2017-09-30 22:50:16 UTC (rev 222684)
@@ -40,7 +40,7 @@
 
 namespace WebKit {
 
-class WebToStorageProcessConnection : public RefCounted<WebToStorageProcessConnection>, public IPC::Connection::Client, public IPC::MessageSender {
+class WebToStorageProcessConnection : public RefCounted<WebToStorageProcessConnection>, private IPC::Connection::Client, private IPC::MessageSender {
 public:
     static Ref<WebToStorageProcessConnection> create(IPC::Connection::Identifier connectionIdentifier)
     {

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebInspector.h (222683 => 222684)


--- trunk/Source/WebKit/WebProcess/WebPage/WebInspector.h	2017-09-30 21:25:50 UTC (rev 222683)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebInspector.h	2017-09-30 22:50:16 UTC (rev 222684)
@@ -36,7 +36,7 @@
 
 class WebPage;
 
-class WebInspector : public API::ObjectImpl<API::Object::Type::BundleInspector>, public IPC::Connection::Client, public Inspector::FrontendChannel {
+class WebInspector : public API::ObjectImpl<API::Object::Type::BundleInspector>, private IPC::Connection::Client, public Inspector::FrontendChannel {
 public:
     static Ref<WebInspector> create(WebPage*);
 

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebInspectorUI.h (222683 => 222684)


--- trunk/Source/WebKit/WebProcess/WebPage/WebInspectorUI.h	2017-09-30 21:25:50 UTC (rev 222683)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebInspectorUI.h	2017-09-30 22:50:16 UTC (rev 222684)
@@ -38,7 +38,7 @@
 
 class WebPage;
 
-class WebInspectorUI : public RefCounted<WebInspectorUI>, public IPC::Connection::Client, public WebCore::InspectorFrontendClient {
+class WebInspectorUI : public RefCounted<WebInspectorUI>, private IPC::Connection::Client, public WebCore::InspectorFrontendClient {
 public:
     static Ref<WebInspectorUI> create(WebPage&);
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to