WebKit Bugzilla
Attachment 358271 Details for
Bug 193097
: IndexedDB: leak WebIDBConnectionToClient for retain cycle
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-193097-20190103125253.patch (text/plain), 15.64 KB, created by
Sihui Liu
on 2019-01-03 12:52:54 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Sihui Liu
Created:
2019-01-03 12:52:54 PST
Size:
15.64 KB
patch
obsolete
>Subversion Revision: 239593 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index dc1f8d982cc8394940734728052ad8004df6fa69..935a3932c6f24bfb4d40fd3daa47d4a27c6676fc 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,42 @@ >+2019-01-03 Sihui Liu <sihui_liu@apple.com> >+ >+ IndexedDB: leak WebIDBConnectionToClient for retain cycle >+ https://bugs.webkit.org/show_bug.cgi?id=193097 >+ <rdar://problem/46899601> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Let IDBConnectionToClientDelegate hold a WeakPtr of IDBConnectionToClientDelegate. >+ >+ * Modules/indexeddb/server/IDBConnectionToClient.cpp: >+ (WebCore::IDBServer::IDBConnectionToClient::IDBConnectionToClient): >+ (WebCore::IDBServer::IDBConnectionToClient::identifier const): >+ (WebCore::IDBServer::IDBConnectionToClient::didDeleteDatabase): >+ (WebCore::IDBServer::IDBConnectionToClient::didOpenDatabase): >+ (WebCore::IDBServer::IDBConnectionToClient::didAbortTransaction): >+ (WebCore::IDBServer::IDBConnectionToClient::didCreateObjectStore): >+ (WebCore::IDBServer::IDBConnectionToClient::didDeleteObjectStore): >+ (WebCore::IDBServer::IDBConnectionToClient::didRenameObjectStore): >+ (WebCore::IDBServer::IDBConnectionToClient::didClearObjectStore): >+ (WebCore::IDBServer::IDBConnectionToClient::didCreateIndex): >+ (WebCore::IDBServer::IDBConnectionToClient::didDeleteIndex): >+ (WebCore::IDBServer::IDBConnectionToClient::didRenameIndex): >+ (WebCore::IDBServer::IDBConnectionToClient::didPutOrAdd): >+ (WebCore::IDBServer::IDBConnectionToClient::didGetRecord): >+ (WebCore::IDBServer::IDBConnectionToClient::didGetAllRecords): >+ (WebCore::IDBServer::IDBConnectionToClient::didGetCount): >+ (WebCore::IDBServer::IDBConnectionToClient::didDeleteRecord): >+ (WebCore::IDBServer::IDBConnectionToClient::didOpenCursor): >+ (WebCore::IDBServer::IDBConnectionToClient::didIterateCursor): >+ (WebCore::IDBServer::IDBConnectionToClient::didCommitTransaction): >+ (WebCore::IDBServer::IDBConnectionToClient::fireVersionChangeEvent): >+ (WebCore::IDBServer::IDBConnectionToClient::didStartTransaction): >+ (WebCore::IDBServer::IDBConnectionToClient::didCloseFromServer): >+ (WebCore::IDBServer::IDBConnectionToClient::notifyOpenDBRequestBlocked): >+ (WebCore::IDBServer::IDBConnectionToClient::didGetAllDatabaseNames): >+ * Modules/indexeddb/server/IDBConnectionToClient.h: >+ * Modules/indexeddb/server/IDBConnectionToClientDelegate.h: >+ > 2019-01-02 Simon Fraser <simon.fraser@apple.com> > > REGRESSION (r239306): Don't disable font smoothing in transparent layers on macOS Mojave and later >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index bafb6efc30b02cba8338a8792b4b0ccc253d984e..a1d770d1e3c28b5f7169618b0a3aa94ce766cadd 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,22 @@ >+2019-01-03 Sihui Liu <sihui_liu@apple.com> >+ >+ IndexedDB: leak WebIDBConnectionToClient for retain cycle >+ https://bugs.webkit.org/show_bug.cgi?id=193097 >+ <rdar://problem/46899601> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Let WebIDBConnectionToClient hold reference to IPC::Connection instead of NetworkConnectionToWebProcess to break >+ the cycle. >+ >+ * NetworkProcess/IndexedDB/WebIDBConnectionToClient.cpp: >+ (WebKit::WebIDBConnectionToClient::create): >+ (WebKit::WebIDBConnectionToClient::WebIDBConnectionToClient): >+ (WebKit::WebIDBConnectionToClient::messageSenderConnection): >+ * NetworkProcess/IndexedDB/WebIDBConnectionToClient.h: >+ * NetworkProcess/NetworkConnectionToWebProcess.cpp: >+ (WebKit::NetworkConnectionToWebProcess::establishIDBConnectionToServer): >+ > 2019-01-03 Chris Dumez <cdumez@apple.com> > > Add release logging to help debug HTTPS upgrade issues >diff --git a/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.cpp b/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.cpp >index 55bea542432a89f74ab2abd97890ca878cb29deb..8c8b72052243769cc9e83e34908ad63c4631a3bb 100644 >--- a/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.cpp >+++ b/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.cpp >@@ -39,128 +39,152 @@ Ref<IDBConnectionToClient> IDBConnectionToClient::create(IDBConnectionToClientDe > } > > IDBConnectionToClient::IDBConnectionToClient(IDBConnectionToClientDelegate& delegate) >- : m_delegate(delegate) >+ : m_delegate(makeWeakPtr(delegate)) > { > } > > uint64_t IDBConnectionToClient::identifier() const > { >+ ASSERT(m_delegate); > return m_delegate->identifier(); > } > > void IDBConnectionToClient::didDeleteDatabase(const IDBResultData& result) > { >- m_delegate->didDeleteDatabase(result); >+ if (m_delegate) >+ m_delegate->didDeleteDatabase(result); > } > > void IDBConnectionToClient::didOpenDatabase(const IDBResultData& result) > { >- m_delegate->didOpenDatabase(result); >+ if (m_delegate) >+ m_delegate->didOpenDatabase(result); > } > > void IDBConnectionToClient::didAbortTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError& error) > { >- m_delegate->didAbortTransaction(transactionIdentifier, error); >+ if (m_delegate) >+ m_delegate->didAbortTransaction(transactionIdentifier, error); > } > > void IDBConnectionToClient::didCreateObjectStore(const IDBResultData& result) > { >- m_delegate->didCreateObjectStore(result); >+ if (m_delegate) >+ m_delegate->didCreateObjectStore(result); > } > > void IDBConnectionToClient::didDeleteObjectStore(const IDBResultData& result) > { >- m_delegate->didDeleteObjectStore(result); >+ if (m_delegate) >+ m_delegate->didDeleteObjectStore(result); > } > > void IDBConnectionToClient::didRenameObjectStore(const IDBResultData& result) > { >- m_delegate->didRenameObjectStore(result); >+ if (m_delegate) >+ m_delegate->didRenameObjectStore(result); > } > > void IDBConnectionToClient::didClearObjectStore(const IDBResultData& result) > { >- m_delegate->didClearObjectStore(result); >+ if (m_delegate) >+ m_delegate->didClearObjectStore(result); > } > > void IDBConnectionToClient::didCreateIndex(const IDBResultData& result) > { >- m_delegate->didCreateIndex(result); >+ if (m_delegate) >+ m_delegate->didCreateIndex(result); > } > > void IDBConnectionToClient::didDeleteIndex(const IDBResultData& result) > { >- m_delegate->didDeleteIndex(result); >+ if (m_delegate) >+ m_delegate->didDeleteIndex(result); > } > > void IDBConnectionToClient::didRenameIndex(const IDBResultData& result) > { >- m_delegate->didRenameIndex(result); >+ if (m_delegate) >+ m_delegate->didRenameIndex(result); > } > > void IDBConnectionToClient::didPutOrAdd(const IDBResultData& result) > { >- m_delegate->didPutOrAdd(result); >+ if (m_delegate) >+ m_delegate->didPutOrAdd(result); > } > > void IDBConnectionToClient::didGetRecord(const IDBResultData& result) > { >- m_delegate->didGetRecord(result); >+ if (m_delegate) >+ m_delegate->didGetRecord(result); > } > > void IDBConnectionToClient::didGetAllRecords(const IDBResultData& result) > { >- m_delegate->didGetAllRecords(result); >+ if (m_delegate) >+ m_delegate->didGetAllRecords(result); > } > > void IDBConnectionToClient::didGetCount(const IDBResultData& result) > { >- m_delegate->didGetCount(result); >+ if (m_delegate) >+ m_delegate->didGetCount(result); > } > > void IDBConnectionToClient::didDeleteRecord(const IDBResultData& result) > { >- m_delegate->didDeleteRecord(result); >+ if (m_delegate) >+ m_delegate->didDeleteRecord(result); > } > > void IDBConnectionToClient::didOpenCursor(const IDBResultData& result) > { >- m_delegate->didOpenCursor(result); >+ if (m_delegate) >+ m_delegate->didOpenCursor(result); > } > > void IDBConnectionToClient::didIterateCursor(const IDBResultData& result) > { >- m_delegate->didIterateCursor(result); >+ if (m_delegate) >+ m_delegate->didIterateCursor(result); > } > > void IDBConnectionToClient::didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError& error) > { >- m_delegate->didCommitTransaction(transactionIdentifier, error); >+ if (m_delegate) >+ m_delegate->didCommitTransaction(transactionIdentifier, error); > } > > void IDBConnectionToClient::fireVersionChangeEvent(UniqueIDBDatabaseConnection& connection, const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion) > { >- m_delegate->fireVersionChangeEvent(connection, requestIdentifier, requestedVersion); >+ if (m_delegate) >+ m_delegate->fireVersionChangeEvent(connection, requestIdentifier, requestedVersion); > } > > void IDBConnectionToClient::didStartTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError& error) > { >- m_delegate->didStartTransaction(transactionIdentifier, error); >+ if (m_delegate) >+ m_delegate->didStartTransaction(transactionIdentifier, error); > } > > void IDBConnectionToClient::didCloseFromServer(UniqueIDBDatabaseConnection& connection, const IDBError& error) > { >- m_delegate->didCloseFromServer(connection, error); >+ if (m_delegate) >+ m_delegate->didCloseFromServer(connection, error); > } > > void IDBConnectionToClient::notifyOpenDBRequestBlocked(const IDBResourceIdentifier& requestIdentifier, uint64_t oldVersion, uint64_t newVersion) > { >- m_delegate->notifyOpenDBRequestBlocked(requestIdentifier, oldVersion, newVersion); >+ if (m_delegate) >+ m_delegate->notifyOpenDBRequestBlocked(requestIdentifier, oldVersion, newVersion); > } > > void IDBConnectionToClient::didGetAllDatabaseNames(uint64_t callbackID, const Vector<String>& databaseNames) > { >- m_delegate->didGetAllDatabaseNames(callbackID, databaseNames); >+ if (m_delegate) >+ m_delegate->didGetAllDatabaseNames(callbackID, databaseNames); > } > > void IDBConnectionToClient::registerDatabaseConnection(UniqueIDBDatabaseConnection& connection) >diff --git a/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h b/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h >index 642813dd0f961fda2b701b493c5fce47b73e9926..160abfeec96003cbb1df335297f7b099d0f6800f 100644 >--- a/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h >+++ b/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h >@@ -31,6 +31,7 @@ > #include <wtf/HashSet.h> > #include <wtf/Ref.h> > #include <wtf/RefCounted.h> >+#include <wtf/WeakPtr.h> > > namespace WebCore { > >@@ -82,7 +83,7 @@ public: > private: > IDBConnectionToClient(IDBConnectionToClientDelegate&); > >- Ref<IDBConnectionToClientDelegate> m_delegate; >+ WeakPtr<IDBConnectionToClientDelegate> m_delegate; > HashSet<UniqueIDBDatabaseConnection*> m_databaseConnections; > }; > >diff --git a/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClientDelegate.h b/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClientDelegate.h >index 479742a9da94e8548d72a2d64eb48594fab5fb47..fdf66407fe358ed937bbedcb69b2528063f5af41 100644 >--- a/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClientDelegate.h >+++ b/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClientDelegate.h >@@ -28,6 +28,7 @@ > #if ENABLE(INDEXED_DATABASE) > > #include <wtf/Forward.h> >+#include <wtf/WeakPtr.h> > #include <wtf/text/WTFString.h> > > namespace WebCore { >@@ -40,7 +41,7 @@ namespace IDBServer { > > class UniqueIDBDatabaseConnection; > >-class IDBConnectionToClientDelegate { >+class IDBConnectionToClientDelegate : public CanMakeWeakPtr<IDBConnectionToClientDelegate> { > public: > virtual ~IDBConnectionToClientDelegate() = default; > >diff --git a/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.cpp b/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.cpp >index 1fe1189c018f508f9f3f0061397555a2ac2953eb..758b642db0fca0b96218d7dccf24ff2dd819ad80 100644 >--- a/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.cpp >+++ b/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.cpp >@@ -44,12 +44,12 @@ > namespace WebKit { > using namespace WebCore; > >-Ref<WebIDBConnectionToClient> WebIDBConnectionToClient::create(NetworkConnectionToWebProcess& connection, uint64_t serverConnectionIdentifier, PAL::SessionID sessionID) >+Ref<WebIDBConnectionToClient> WebIDBConnectionToClient::create(IPC::Connection& connection, uint64_t serverConnectionIdentifier, PAL::SessionID sessionID) > { > return adoptRef(*new WebIDBConnectionToClient(connection, serverConnectionIdentifier, sessionID)); > } > >-WebIDBConnectionToClient::WebIDBConnectionToClient(NetworkConnectionToWebProcess& connection, uint64_t serverConnectionIdentifier, PAL::SessionID sessionID) >+WebIDBConnectionToClient::WebIDBConnectionToClient(IPC::Connection& connection, uint64_t serverConnectionIdentifier, PAL::SessionID sessionID) > : m_connection(connection) > , m_identifier(serverConnectionIdentifier) > , m_sessionID(sessionID) >@@ -70,7 +70,7 @@ void WebIDBConnectionToClient::disconnectedFromWebProcess() > > IPC::Connection* WebIDBConnectionToClient::messageSenderConnection() > { >- return &m_connection->connection(); >+ return m_connection.ptr(); > } > > WebCore::IDBServer::IDBConnectionToClient& WebIDBConnectionToClient::connectionToClient() >diff --git a/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.h b/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.h >index 5926b00213a72b3073f2c047c60b1ec4449c7f80..fa491b46a76f7131e3f17cf7f76f160d9af64a40 100644 >--- a/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.h >+++ b/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.h >@@ -52,7 +52,7 @@ namespace WebKit { > > class WebIDBConnectionToClient final : public WebCore::IDBServer::IDBConnectionToClientDelegate, public IPC::MessageSender, public RefCounted<WebIDBConnectionToClient> { > public: >- static Ref<WebIDBConnectionToClient> create(NetworkConnectionToWebProcess&, uint64_t serverConnectionIdentifier, PAL::SessionID); >+ static Ref<WebIDBConnectionToClient> create(IPC::Connection&, uint64_t serverConnectionIdentifier, PAL::SessionID); > > virtual ~WebIDBConnectionToClient(); > >@@ -126,13 +126,13 @@ public: > void didReceiveMessage(IPC::Connection&, IPC::Decoder&); > > private: >- WebIDBConnectionToClient(NetworkConnectionToWebProcess&, uint64_t serverConnectionIdentifier, PAL::SessionID); >+ WebIDBConnectionToClient(IPC::Connection&, uint64_t serverConnectionIdentifier, PAL::SessionID); > > IPC::Connection* messageSenderConnection() final; > > template<class MessageType> void handleGetResult(const WebCore::IDBResultData&); > >- Ref<NetworkConnectionToWebProcess> m_connection; >+ Ref<IPC::Connection> m_connection; > > uint64_t m_identifier; > PAL::SessionID m_sessionID; >diff --git a/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp b/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp >index dfa9974e732ddd2b46c4da02074f715f17430167..ab5ed47231806af9cc98b07288a7254b2414284b 100644 >--- a/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp >@@ -702,7 +702,7 @@ void NetworkConnectionToWebProcess::establishIDBConnectionToServer(PAL::SessionI > LOG(IndexedDB, "NetworkConnectionToWebProcess::establishIDBConnectionToServer - %" PRIu64, serverConnectionIdentifier); > ASSERT(!m_webIDBConnections.contains(serverConnectionIdentifier)); > >- m_webIDBConnections.set(serverConnectionIdentifier, WebIDBConnectionToClient::create(*this, serverConnectionIdentifier, sessionID)); >+ m_webIDBConnections.set(serverConnectionIdentifier, WebIDBConnectionToClient::create(m_connection.get(), serverConnectionIdentifier, sessionID)); > } > > void NetworkConnectionToWebProcess::removeIDBConnectionToServer(uint64_t serverConnectionIdentifier)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 193097
:
358271
|
358930
|
359249