Changeset 246526 in webkit
- Timestamp:
- Jun 17, 2019, 5:17:24 PM (6 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r246521 r246526 1 2019-06-17 Alex Christensen <achristensen@webkit.org> 2 3 Protect StorageManager::m_localStorageNamespaces with a Lock 4 https://bugs.webkit.org/show_bug.cgi?id=198939 5 <rdar://problem/51784225> 6 7 Reviewed by Geoff Garen. 8 9 StorageManager::LocalStorageNamespace::didDestroyStorageArea is called from StorageArea::~StorageArea which is called on the main thread. 10 All other access of m_localStorageNamespaces is from the non-main thread. Sometimes this causes hash table corruption, so wait for a mutex 11 before accessing this member variable. 12 13 * NetworkProcess/WebStorage/StorageManager.cpp: 14 (WebKit::StorageManager::LocalStorageNamespace::didDestroyStorageArea): 15 (WebKit::StorageManager::cloneSessionStorageNamespace): 16 (WebKit::StorageManager::getLocalStorageOrigins): 17 (WebKit::StorageManager::deleteLocalStorageEntriesForOrigin): 18 (WebKit::StorageManager::deleteLocalStorageOriginsModifiedSince): 19 (WebKit::StorageManager::deleteLocalStorageEntriesForOrigins): 20 (WebKit::StorageManager::getOrCreateLocalStorageNamespace): 21 * NetworkProcess/WebStorage/StorageManager.h: 22 1 23 2019-06-17 Alex Christensen <achristensen@webkit.org> 2 24 -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp
r246079 r246526 377 377 return; 378 378 379 std::lock_guard<Lock> lock(m_storageManager.m_localStorageNamespacesMutex); 379 380 ASSERT(m_storageManager.m_localStorageNamespaces.contains(m_storageNamespaceID)); 380 381 m_storageManager.m_localStorageNamespaces.remove(m_storageNamespaceID); … … 573 574 574 575 if (!m_localStorageDatabaseTracker) { 576 std::lock_guard<Lock> lock(m_localStorageNamespacesMutex); 575 577 if (auto* localStorageNamespace = m_localStorageNamespaces.get(storageNamespaceID)) { 576 578 LocalStorageNamespace* newlocalStorageNamespace = getOrCreateLocalStorageNamespace(newStorageNamespaceID); … … 663 665 origins.add(origin); 664 666 } else { 667 std::lock_guard<Lock> lock(m_localStorageNamespacesMutex); 665 668 for (const auto& localStorageNameSpace : m_localStorageNamespaces.values()) { 666 669 for (auto& origin : localStorageNameSpace->ephemeralOrigins()) … … 696 699 { 697 700 m_queue->dispatch([this, protectedThis = makeRef(*this), copiedOrigin = securityOrigin.isolatedCopy()]() mutable { 698 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 699 localStorageNamespace->clearStorageAreasMatchingOrigin(copiedOrigin); 701 { 702 std::lock_guard<Lock> lock(m_localStorageNamespacesMutex); 703 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 704 localStorageNamespace->clearStorageAreasMatchingOrigin(copiedOrigin); 705 } 700 706 701 707 for (auto& transientLocalStorageNamespace : m_transientLocalStorageNamespaces.values()) … … 717 723 718 724 for (const auto& origin : originsToDelete) { 719 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 720 localStorageNamespace->clearStorageAreasMatchingOrigin(origin); 725 { 726 std::lock_guard<Lock> lock(m_localStorageNamespacesMutex); 727 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 728 localStorageNamespace->clearStorageAreasMatchingOrigin(origin); 729 } 721 730 722 731 m_localStorageDatabaseTracker->deleteDatabaseWithOrigin(origin); 723 732 } 724 733 } else { 734 std::lock_guard<Lock> lock(m_localStorageNamespacesMutex); 725 735 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 726 736 localStorageNamespace->clearAllStorageAreas(); … … 741 751 m_queue->dispatch([this, protectedThis = makeRef(*this), copiedOrigins = WTFMove(copiedOrigins), completionHandler = WTFMove(completionHandler)]() mutable { 742 752 for (auto& origin : copiedOrigins) { 743 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 744 localStorageNamespace->clearStorageAreasMatchingOrigin(origin); 753 { 754 std::lock_guard<Lock> lock(m_localStorageNamespacesMutex); 755 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 756 localStorageNamespace->clearStorageAreasMatchingOrigin(origin); 757 } 745 758 746 759 for (auto& transientLocalStorageNamespace : m_transientLocalStorageNamespaces.values()) … … 1000 1013 StorageManager::LocalStorageNamespace* StorageManager::getOrCreateLocalStorageNamespace(uint64_t storageNamespaceID) 1001 1014 { 1015 std::lock_guard<Lock> lock(m_localStorageNamespacesMutex); 1002 1016 if (!m_localStorageNamespaces.isValidKey(storageNamespaceID)) 1003 1017 return nullptr; -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h
r246132 r246526 106 106 RefPtr<LocalStorageDatabaseTracker> m_localStorageDatabaseTracker; 107 107 HashMap<uint64_t, RefPtr<LocalStorageNamespace>> m_localStorageNamespaces; 108 Lock m_localStorageNamespacesMutex; 108 109 109 110 HashMap<std::pair<uint64_t, WebCore::SecurityOriginData>, RefPtr<TransientLocalStorageNamespace>> m_transientLocalStorageNamespaces;
Note:
See TracChangeset
for help on using the changeset viewer.