Title: [259090] trunk/Source/WebCore
Revision
259090
Author
sihui_...@apple.com
Date
2020-03-26 16:09:59 -0700 (Thu, 26 Mar 2020)

Log Message

REGRESSION(r259034): access to null UniqueIDBDatabase in UniqueIDBDatabaseConnection::~UniqueIDBDatabaseConnection()
https://bugs.webkit.org/show_bug.cgi?id=209618
<rdar://problem/60919105>

Reviewed by Geoffrey Garen.

It's possible UniqueIDBDatabase is destroyed before UniqueIDBDatabaseConnection in
UniqueIDBDatabase::connectionClosedFromClient, so it's better not access
UniqueIDBDatabase in ~UniqueIDBDatabaseConnection() and let UniqueIDBDatabaseConnection have a IDBServer member.

* Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp:
(WebCore::IDBServer::UniqueIDBDatabaseConnection::UniqueIDBDatabaseConnection):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::~UniqueIDBDatabaseConnection):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::connectionClosedFromClient):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::didFireVersionChangeEvent):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::didFinishHandlingVersionChange):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::establishTransaction):
* Modules/indexeddb/server/UniqueIDBDatabaseConnection.h:
(WebCore::IDBServer::UniqueIDBDatabaseConnection::database):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::server):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (259089 => 259090)


--- trunk/Source/WebCore/ChangeLog	2020-03-26 23:06:30 UTC (rev 259089)
+++ trunk/Source/WebCore/ChangeLog	2020-03-26 23:09:59 UTC (rev 259090)
@@ -1,3 +1,27 @@
+2020-03-26  Sihui Liu  <sihui_...@apple.com>
+
+        REGRESSION(r259034): access to null UniqueIDBDatabase in UniqueIDBDatabaseConnection::~UniqueIDBDatabaseConnection()
+        https://bugs.webkit.org/show_bug.cgi?id=209618
+        <rdar://problem/60919105>
+
+        Reviewed by Geoffrey Garen.
+
+        It's possible UniqueIDBDatabase is destroyed before UniqueIDBDatabaseConnection in 
+        UniqueIDBDatabase::connectionClosedFromClient, so it's better not access 
+        UniqueIDBDatabase in ~UniqueIDBDatabaseConnection() and let UniqueIDBDatabaseConnection have a IDBServer member.
+
+        * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp:
+        (WebCore::IDBServer::UniqueIDBDatabaseConnection::UniqueIDBDatabaseConnection):
+        (WebCore::IDBServer::UniqueIDBDatabaseConnection::~UniqueIDBDatabaseConnection):
+        (WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback):
+        (WebCore::IDBServer::UniqueIDBDatabaseConnection::connectionClosedFromClient):
+        (WebCore::IDBServer::UniqueIDBDatabaseConnection::didFireVersionChangeEvent):
+        (WebCore::IDBServer::UniqueIDBDatabaseConnection::didFinishHandlingVersionChange):
+        (WebCore::IDBServer::UniqueIDBDatabaseConnection::establishTransaction):
+        * Modules/indexeddb/server/UniqueIDBDatabaseConnection.h:
+        (WebCore::IDBServer::UniqueIDBDatabaseConnection::database):
+        (WebCore::IDBServer::UniqueIDBDatabaseConnection::server):
+
 2020-03-26  Daniel Bates  <daba...@apple.com>
 
         Remove hitTestOrder from ElementContext as it is no longer need

Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp (259089 => 259090)


--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp	2020-03-26 23:06:30 UTC (rev 259089)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp	2020-03-26 23:09:59 UTC (rev 259090)
@@ -43,11 +43,12 @@
 }
 
 UniqueIDBDatabaseConnection::UniqueIDBDatabaseConnection(UniqueIDBDatabase& database, ServerOpenDBRequest& request)
-    : m_database(&database)
+    : m_database(makeWeakPtr(database))
+    , m_server(database.server())
     , m_connectionToClient(request.connection())
     , m_openRequestIdentifier(request.requestData().requestIdentifier())
 {
-    server()->registerDatabaseConnection(*this);
+    m_server.registerDatabaseConnection(*this);
     m_connectionToClient->registerDatabaseConnection(*this);
 }
 
@@ -55,7 +56,7 @@
 {
     ASSERT(m_transactionMap.isEmpty());
 
-    server()->unregisterDatabaseConnection(*this);
+    m_server.unregisterDatabaseConnection(*this);
     m_connectionToClient->unregisterDatabaseConnection(*this);
 }
 
@@ -67,11 +68,10 @@
 void UniqueIDBDatabaseConnection::abortTransactionWithoutCallback(UniqueIDBDatabaseTransaction& transaction)
 {
     ASSERT(m_transactionMap.contains(transaction.info().identifier()));
+    ASSERT(m_database);
 
     const auto& transactionIdentifier = transaction.info().identifier();
-    RefPtr<UniqueIDBDatabaseConnection> protectedThis(this);
-
-    m_database->abortTransaction(transaction, [this, protectedThis, transactionIdentifier](const IDBError&) {
+    m_database->abortTransaction(transaction, [this, transactionIdentifier](const IDBError&) {
         ASSERT(m_transactionMap.contains(transactionIdentifier));
         m_transactionMap.remove(transactionIdentifier);
     });
@@ -88,6 +88,7 @@
 {
     LOG(IndexedDB, "UniqueIDBDatabaseConnection::connectionClosedFromClient - %s - %" PRIu64, m_openRequestIdentifier.loggingString().utf8().data(), identifier());
 
+    ASSERT(m_database);
     m_database->connectionClosedFromClient(*this);
 }
 
@@ -95,6 +96,7 @@
 {
     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didFireVersionChangeEvent - %s - %" PRIu64, m_openRequestIdentifier.loggingString().utf8().data(), identifier());
 
+    ASSERT(m_database);
     m_database->didFireVersionChangeEvent(*this, requestIdentifier, connectionClosed);
 }
 
@@ -102,6 +104,7 @@
 {
     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didFinishHandlingVersionChange - %s - %" PRIu64, transactionIdentifier.loggingString().utf8().data(), identifier());
 
+    ASSERT(m_database);
     m_database->didFinishHandlingVersionChange(*this, transactionIdentifier);
 }
 
@@ -137,6 +140,7 @@
     Ref<UniqueIDBDatabaseTransaction> transaction = UniqueIDBDatabaseTransaction::create(*this, info);
     m_transactionMap.set(transaction->info().identifier(), &transaction.get());
 
+    ASSERT(m_database);
     m_database->enqueueTransaction(WTFMove(transaction));
 }
 

Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h (259089 => 259090)


--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h	2020-03-26 23:06:30 UTC (rev 259089)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h	2020-03-26 23:09:59 UTC (rev 259090)
@@ -53,8 +53,8 @@
     ~UniqueIDBDatabaseConnection();
 
     const IDBResourceIdentifier& openRequestIdentifier() { return m_openRequestIdentifier; }
-    UniqueIDBDatabase* database() { return m_database; }
-    IDBServer* server() { return &m_database->server(); }
+    UniqueIDBDatabase* database() { return m_database.get(); }
+    IDBServer* server() { return &m_server; }
     IDBConnectionToClient& connectionToClient() { return m_connectionToClient; }
 
     void connectionPendingCloseFromClient();
@@ -89,7 +89,8 @@
 private:
     UniqueIDBDatabaseConnection(UniqueIDBDatabase&, ServerOpenDBRequest&);
 
-    UniqueIDBDatabase* m_database;
+    WeakPtr<UniqueIDBDatabase> m_database;
+    IDBServer& m_server;
     Ref<IDBConnectionToClient> m_connectionToClient;
     IDBResourceIdentifier m_openRequestIdentifier;
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to