IndexedDB 2.0: REGRESSION(r208467) Fix flaky crashes in IDB GC-related code.
authorbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 10 Nov 2016 18:04:03 +0000 (18:04 +0000)
committerbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 10 Nov 2016 18:04:03 +0000 (18:04 +0000)
https://bugs.webkit.org/show_bug.cgi?id=164596

Reviewed by Eric Carlson.

No new tests (Covered by existing tests).

We can't just WTFMove the pointers from the deleted-IDBObject maps...
We need to remove the entries, too.

* Modules/indexeddb/IDBObjectStore.cpp:
(WebCore::IDBObjectStore::rollbackForVersionChangeAbort):

* Modules/indexeddb/IDBTransaction.cpp:
(WebCore::IDBTransaction::internalAbort):

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

Source/WebCore/ChangeLog
Source/WebCore/Modules/indexeddb/IDBObjectStore.cpp
Source/WebCore/Modules/indexeddb/IDBTransaction.cpp

index 6fe9005..ab47bef 100644 (file)
@@ -1,3 +1,21 @@
+2016-11-10  Brady Eidson  <beidson@apple.com>
+
+        IndexedDB 2.0: REGRESSION(r208467) Fix flaky crashes in IDB GC-related code.
+        https://bugs.webkit.org/show_bug.cgi?id=164596
+
+        Reviewed by Eric Carlson.
+
+        No new tests (Covered by existing tests).
+
+        We can't just WTFMove the pointers from the deleted-IDBObject maps...
+        We need to remove the entries, too.
+
+        * Modules/indexeddb/IDBObjectStore.cpp:
+        (WebCore::IDBObjectStore::rollbackForVersionChangeAbort):
+
+        * Modules/indexeddb/IDBTransaction.cpp:
+        (WebCore::IDBTransaction::internalAbort):
+
 2016-11-10  Youenn Fablet  <youennf@gmail.com>
 
         MediaStreamTrack should use more Ref<> and less RefPtr<>
index 168ec6f..aeb8948 100644 (file)
@@ -618,13 +618,19 @@ void IDBObjectStore::rollbackForVersionChangeAbort()
     }
 
     Locker<Lock> locker(m_referencedIndexLock);
+
+    Vector<uint64_t> identifiersToRemove;
     for (auto& iterator : m_deletedIndexes) {
         if (m_info.hasIndex(iterator.key)) {
             auto name = iterator.value->info().name();
             m_referencedIndexes.set(name, WTFMove(iterator.value));
+            identifiersToRemove.append(iterator.key);
         }
     }
 
+    for (auto identifier : identifiersToRemove)
+        m_deletedIndexes.remove(identifier);
+
     for (auto& index : m_referencedIndexes.values())
         index->rollbackInfoForVersionChangeAbort();
 }
index 8b011f7..38decd5 100644 (file)
@@ -226,13 +226,18 @@ void IDBTransaction::internalAbort()
         Locker<Lock> locker(m_referencedObjectStoreLock);
 
         auto& info = m_database->info();
+        Vector<uint64_t> identifiersToRemove;
         for (auto& iterator : m_deletedObjectStores) {
             if (info.infoForExistingObjectStore(iterator.key)) {
                 auto name = iterator.value->info().name();
                 m_referencedObjectStores.set(name, WTFMove(iterator.value));
+                identifiersToRemove.append(iterator.key);
             }
         }
 
+        for (auto identifier : identifiersToRemove)
+            m_deletedObjectStores.remove(identifier);
+
         for (auto& objectStore : m_referencedObjectStores.values())
             objectStore->rollbackForVersionChangeAbort();
     }