Changeset 247250 in webkit
- Timestamp:
- Jul 8, 2019 8:06:12 PM (5 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r247243 r247250 1 2019-07-08 Chris Dumez <cdumez@apple.com> 2 3 Speculative fix for crashes under LocalStorageDatabaseTracker::databasePath() 4 https://bugs.webkit.org/show_bug.cgi?id=199599 5 <rdar://problem/31169686> 6 7 Reviewed by Ryosuke Niwa. 8 9 Speculative fix for crashes under LocalStorageDatabaseTracker::databasePath(): 10 - Add new localStorageDirectory() getter to LocalStorageDatabaseTracker which 11 calls isolatedCopy() on m_localStorageDirectory before returning it. 12 Use it everywhere instead of m_localStorageDirectory since it is not safe 13 to use the same String from various threads like it was done. 14 - Move localStorageDirectory when constructing the LocalStorageDatabaseTracker 15 instead of copying it. 16 - Make sure that LocalStorageDatabaseTracker and StorageManager are both 17 constructed and destroyed on the main thread. 18 19 * NetworkProcess/NetworkSession.cpp: 20 (WebKit::NetworkSession::NetworkSession): 21 * NetworkProcess/NetworkSession.h: 22 * NetworkProcess/WebStorage/LocalStorageDatabaseTracker.cpp: 23 (WebKit::LocalStorageDatabaseTracker::create): 24 (WebKit::LocalStorageDatabaseTracker::LocalStorageDatabaseTracker): 25 (WebKit::LocalStorageDatabaseTracker::localStorageDirectory const): 26 (WebKit::LocalStorageDatabaseTracker::~LocalStorageDatabaseTracker): 27 (WebKit::LocalStorageDatabaseTracker::deleteAllDatabases): 28 (WebKit::LocalStorageDatabaseTracker::origins const): 29 (WebKit::LocalStorageDatabaseTracker::databasePath const): 30 * NetworkProcess/WebStorage/LocalStorageDatabaseTracker.h: 31 * NetworkProcess/WebStorage/StorageManager.cpp: 32 (WebKit::StorageManager::create): 33 (WebKit::StorageManager::StorageManager): 34 (WebKit::StorageManager::~StorageManager): 35 * NetworkProcess/WebStorage/StorageManager.h: 36 * NetworkProcess/WebStorage/ios/LocalStorageDatabaseTrackerIOS.mm: 37 (WebKit::LocalStorageDatabaseTracker::platformMaybeExcludeFromBackup const): 38 * NetworkProcess/cocoa/NetworkSessionCocoa.mm: 39 (WebKit::NetworkSessionCocoa::NetworkSessionCocoa): 40 * NetworkProcess/curl/NetworkSessionCurl.cpp: 41 (WebKit::NetworkSessionCurl::NetworkSessionCurl): 42 * NetworkProcess/soup/NetworkSessionSoup.cpp: 43 (WebKit::NetworkSessionSoup::NetworkSessionSoup): 44 1 45 2019-07-08 Chris Dumez <cdumez@apple.com> 2 46 -
trunk/Source/WebKit/NetworkProcess/NetworkSession.cpp
r246569 r247250 78 78 } 79 79 80 NetworkSession::NetworkSession(NetworkProcess& networkProcess, PAL::SessionID sessionID, const String& localStorageDirectory, SandboxExtension::Handle& handle)80 NetworkSession::NetworkSession(NetworkProcess& networkProcess, PAL::SessionID sessionID, String&& localStorageDirectory, SandboxExtension::Handle& handle) 81 81 : m_sessionID(sessionID) 82 82 , m_networkProcess(networkProcess) 83 83 , m_adClickAttribution(makeUniqueRef<AdClickAttributionManager>(sessionID)) 84 , m_storageManager(StorageManager::create( localStorageDirectory))84 , m_storageManager(StorageManager::create(WTFMove(localStorageDirectory))) 85 85 { 86 86 SandboxExtension::consumePermanently(handle); -
trunk/Source/WebKit/NetworkProcess/NetworkSession.h
r246569 r247250 109 109 110 110 protected: 111 NetworkSession(NetworkProcess&, PAL::SessionID, const String& localStorageDirectory, SandboxExtension::Handle&);111 NetworkSession(NetworkProcess&, PAL::SessionID, String&& localStorageDirectory, SandboxExtension::Handle&); 112 112 113 113 PAL::SessionID m_sessionID; -
trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageDatabaseTracker.cpp
r245569 r247250 40 40 using namespace WebCore; 41 41 42 Ref<LocalStorageDatabaseTracker> LocalStorageDatabaseTracker::create(Ref<WorkQueue>&& queue, const String& localStorageDirectory)42 Ref<LocalStorageDatabaseTracker> LocalStorageDatabaseTracker::create(Ref<WorkQueue>&& queue, String&& localStorageDirectory) 43 43 { 44 return adoptRef(*new LocalStorageDatabaseTracker(WTFMove(queue), localStorageDirectory));44 return adoptRef(*new LocalStorageDatabaseTracker(WTFMove(queue), WTFMove(localStorageDirectory))); 45 45 } 46 46 47 LocalStorageDatabaseTracker::LocalStorageDatabaseTracker(Ref<WorkQueue>&& queue, const String& localStorageDirectory)47 LocalStorageDatabaseTracker::LocalStorageDatabaseTracker(Ref<WorkQueue>&& queue, String&& localStorageDirectory) 48 48 : m_queue(WTFMove(queue)) 49 , m_localStorageDirectory( localStorageDirectory.isolatedCopy())49 , m_localStorageDirectory(WTFMove(localStorageDirectory)) 50 50 { 51 ASSERT(RunLoop::isMain()); 52 51 53 // Make sure the encoding is initialized before we start dispatching things to the queue. 52 54 UTF8Encoding(); … … 58 60 } 59 61 62 String LocalStorageDatabaseTracker::localStorageDirectory() const 63 { 64 return m_localStorageDirectory.isolatedCopy(); 65 } 66 60 67 LocalStorageDatabaseTracker::~LocalStorageDatabaseTracker() 61 68 { 69 ASSERT(RunLoop::isMain()); 62 70 } 63 71 … … 83 91 void LocalStorageDatabaseTracker::deleteAllDatabases() 84 92 { 85 auto paths = FileSystem::listDirectory(m_localStorageDirectory, "*.localstorage"); 93 auto localStorageDirectory = this->localStorageDirectory(); 94 auto paths = FileSystem::listDirectory(localStorageDirectory, "*.localstorage"); 86 95 for (const auto& path : paths) { 87 96 SQLiteFileSystem::deleteDatabaseFile(path); … … 90 99 } 91 100 92 SQLiteFileSystem::deleteEmptyDatabaseDirectory( m_localStorageDirectory);101 SQLiteFileSystem::deleteEmptyDatabaseDirectory(localStorageDirectory); 93 102 } 94 103 … … 115 124 { 116 125 Vector<SecurityOriginData> databaseOrigins; 117 auto paths = FileSystem::listDirectory( m_localStorageDirectory, "*.localstorage");126 auto paths = FileSystem::listDirectory(localStorageDirectory(), "*.localstorage"); 118 127 119 128 for (const auto& path : paths) { … … 151 160 String LocalStorageDatabaseTracker::databasePath(const String& filename) const 152 161 { 153 if (!SQLiteFileSystem::ensureDatabaseDirectoryExists(m_localStorageDirectory)) { 162 auto localStorageDirectory = this->localStorageDirectory(); 163 if (!SQLiteFileSystem::ensureDatabaseDirectoryExists(localStorageDirectory)) { 154 164 if (!m_localStorageDirectory.isNull()) 155 165 LOG_ERROR("Unable to create LocalStorage database path %s", m_localStorageDirectory.utf8().data()); … … 163 173 #endif 164 174 165 return SQLiteFileSystem::appendDatabaseFileNameToPath( m_localStorageDirectory, filename);175 return SQLiteFileSystem::appendDatabaseFileNameToPath(localStorageDirectory, filename); 166 176 } 167 177 -
trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageDatabaseTracker.h
r247092 r247250 36 36 namespace WebKit { 37 37 38 class LocalStorageDatabaseTracker : public ThreadSafeRefCounted<LocalStorageDatabaseTracker > {38 class LocalStorageDatabaseTracker : public ThreadSafeRefCounted<LocalStorageDatabaseTracker, WTF::DestructionThread::MainRunLoop> { 39 39 public: 40 static Ref<LocalStorageDatabaseTracker> create(Ref<WorkQueue>&&, const String& localStorageDirectory);40 static Ref<LocalStorageDatabaseTracker> create(Ref<WorkQueue>&&, String&& localStorageDirectory); 41 41 ~LocalStorageDatabaseTracker(); 42 42 … … 65 65 66 66 private: 67 LocalStorageDatabaseTracker(Ref<WorkQueue>&&, const String& localStorageDirectory);67 LocalStorageDatabaseTracker(Ref<WorkQueue>&&, String&& localStorageDirectory); 68 68 69 69 String databasePath(const String& filename) const; 70 String localStorageDirectory() const; 70 71 71 72 enum DatabaseOpeningStrategy { … … 75 76 76 77 Ref<WorkQueue> m_queue; 77 String m_localStorageDirectory; 78 79 // It is not safe to use this member from a background thread, call localStorageDirectory() instead. 80 const String m_localStorageDirectory; 78 81 79 82 #if PLATFORM(IOS_FAMILY) -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp
r247126 r247250 482 482 } 483 483 484 Ref<StorageManager> StorageManager::create( const String& localStorageDirectory)485 { 486 return adoptRef(*new StorageManager( localStorageDirectory));487 } 488 489 StorageManager::StorageManager( const String& localStorageDirectory)484 Ref<StorageManager> StorageManager::create(String&& localStorageDirectory) 485 { 486 return adoptRef(*new StorageManager(WTFMove(localStorageDirectory))); 487 } 488 489 StorageManager::StorageManager(String&& localStorageDirectory) 490 490 : m_queue(WorkQueue::create("com.apple.WebKit.StorageManager")) 491 491 { 492 ASSERT(RunLoop::isMain()); 493 492 494 // Make sure the encoding is initialized before we start dispatching things to the queue. 493 495 UTF8Encoding(); 494 496 if (!localStorageDirectory.isNull()) 495 m_localStorageDatabaseTracker = LocalStorageDatabaseTracker::create(m_queue.copyRef(), localStorageDirectory);497 m_localStorageDatabaseTracker = LocalStorageDatabaseTracker::create(m_queue.copyRef(), WTFMove(localStorageDirectory)); 496 498 } 497 499 498 500 StorageManager::~StorageManager() 499 501 { 502 ASSERT(RunLoop::isMain()); 500 503 } 501 504 -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h
r247082 r247250 46 46 using GetValuesCallback = CompletionHandler<void(const HashMap<String, String>&)>; 47 47 48 class StorageManager : public ThreadSafeRefCounted<StorageManager > {48 class StorageManager : public ThreadSafeRefCounted<StorageManager, WTF::DestructionThread::MainRunLoop> { 49 49 public: 50 static Ref<StorageManager> create( const String& localStorageDirectory);50 static Ref<StorageManager> create(String&& localStorageDirectory); 51 51 ~StorageManager(); 52 52 … … 78 78 79 79 private: 80 explicit StorageManager( const String& localStorageDirectory);80 explicit StorageManager(String&& localStorageDirectory); 81 81 82 82 // Message handlers. -
trunk/Source/WebKit/NetworkProcess/WebStorage/ios/LocalStorageDatabaseTrackerIOS.mm
r245540 r247250 41 41 42 42 if (linkedOnOrAfter(SDKVersion::FirstToExcludeLocalStorageFromBackup)) 43 [[NSURL fileURLWithPath:(NSString *) m_localStorageDirectoryisDirectory:YES] setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:nil];43 [[NSURL fileURLWithPath:(NSString *)localStorageDirectory() isDirectory:YES] setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:nil]; 44 44 } 45 45 -
trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm
r247095 r247250 925 925 926 926 NetworkSessionCocoa::NetworkSessionCocoa(NetworkProcess& networkProcess, NetworkSessionCreationParameters&& parameters) 927 : NetworkSession(networkProcess, parameters.sessionID, parameters.localStorageDirectory, parameters.localStorageDirectoryExtensionHandle)927 : NetworkSession(networkProcess, parameters.sessionID, WTFMove(parameters.localStorageDirectory), parameters.localStorageDirectoryExtensionHandle) 928 928 , m_boundInterfaceIdentifier(parameters.boundInterfaceIdentifier) 929 929 , m_sourceApplicationBundleIdentifier(parameters.sourceApplicationBundleIdentifier) -
trunk/Source/WebKit/NetworkProcess/curl/NetworkSessionCurl.cpp
r246569 r247250 39 39 40 40 NetworkSessionCurl::NetworkSessionCurl(NetworkProcess& networkProcess, NetworkSessionCreationParameters&& parameters) 41 : NetworkSession(networkProcess, parameters.sessionID, parameters.localStorageDirectory, parameters.localStorageDirectoryExtensionHandle)41 : NetworkSession(networkProcess, parameters.sessionID, WTFMove(parameters.localStorageDirectory), parameters.localStorageDirectoryExtensionHandle) 42 42 { 43 43 if (!parameters.cookiePersistentStorageFile.isEmpty()) -
trunk/Source/WebKit/NetworkProcess/soup/NetworkSessionSoup.cpp
r246878 r247250 41 41 42 42 NetworkSessionSoup::NetworkSessionSoup(NetworkProcess& networkProcess, NetworkSessionCreationParameters&& parameters) 43 : NetworkSession(networkProcess, parameters.sessionID, parameters.localStorageDirectory, parameters.localStorageDirectoryExtensionHandle)43 : NetworkSession(networkProcess, parameters.sessionID, WTFMove(parameters.localStorageDirectory), parameters.localStorageDirectoryExtensionHandle) 44 44 { 45 45 networkStorageSession()->setCookieObserverHandler([this] {
Note: See TracChangeset
for help on using the changeset viewer.