Commit 23afef42 authored by jberlin@webkit.org's avatar jberlin@webkit.org

If deleting the StorageTracker.db file fails, local storage is left in a strange state.

https://bugs.webkit.org/show_bug.cgi?id=58805

Reviewed by Steve Falkenburg.

* storage/StorageTracker.cpp:
(WebCore::StorageTracker::syncFileSystemAndTrackerDatabase):
When cleaning up the StorageTracker.db file, is not enough to call syncDeleteOrigin.
deleteOrigin itself must be called to update the data structures that syncDeleteOrigin
depends on and to prevent clashes between a theoretical web page editing local storage
at the same time this method is called.
(WebCore::StorageTracker::syncDeleteAllOrigins):
If it is not possible to delete the StorageTracker.db file, empty it.
(WebCore::StorageTracker::deleteOriginOnMainThread):
Wrapper for deleteOrigin.
* storage/StorageTracker.h:



git-svn-id: svn://svn.chromium.org/blink/trunk@84208 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent be985166
2011-04-18 Jessie Berlin <jberlin@apple.com>
Reviewed by Steve Falkenburg.
If deleting the StorageTracker.db file fails, local storage is left in a strange state.
https://bugs.webkit.org/show_bug.cgi?id=58805
* storage/StorageTracker.cpp:
(WebCore::StorageTracker::syncFileSystemAndTrackerDatabase):
When cleaning up the StorageTracker.db file, is not enough to call syncDeleteOrigin.
deleteOrigin itself must be called to update the data structures that syncDeleteOrigin
depends on and to prevent clashes between a theoretical web page editing local storage
at the same time this method is called.
(WebCore::StorageTracker::syncDeleteAllOrigins):
If it is not possible to delete the StorageTracker.db file, empty it.
(WebCore::StorageTracker::deleteOriginOnMainThread):
Wrapper for deleteOrigin.
* storage/StorageTracker.h:
2011-04-18 Geoffrey Garen <ggaren@apple.com>
Build fix.
......@@ -232,8 +232,10 @@ void StorageTracker::syncFileSystemAndTrackerDatabase()
// Delete stale StorageTracker records.
OriginSet::const_iterator setEnd = originSetCopy.end();
for (OriginSet::const_iterator it = originSetCopy.begin(); it != setEnd; ++it) {
if (!foundOrigins.contains(*it))
syncDeleteOrigin(*it);
if (!foundOrigins.contains(*it)) {
RefPtr<StringImpl> originIdentifier = (*it).threadsafeCopy().impl();
callOnMainThread(deleteOriginOnMainThread, originIdentifier.release().leakRef());
}
}
}
......@@ -376,10 +378,33 @@ void StorageTracker::syncDeleteAllOrigins()
if (m_database.isOpen())
m_database.close();
SQLiteFileSystem::deleteDatabaseFile(trackerDatabasePath());
if (!SQLiteFileSystem::deleteDatabaseFile(trackerDatabasePath())) {
// In the case where it is not possible to delete the database file (e.g some other program
// like a virus scanner is accessing it), make sure to remove all entries.
openTrackerDatabase(false);
if (!m_database.isOpen())
return;
SQLiteStatement deleteStatement(m_database, "DELETE FROM Origins");
if (deleteStatement.prepare() != SQLResultOk) {
LOG_ERROR("Unable to prepare deletion of all origins");
return;
}
if (!deleteStatement.executeCommand()) {
LOG_ERROR("Unable to execute deletion of all origins");
return;
}
}
SQLiteFileSystem::deleteEmptyDatabaseDirectory(m_storageDirectoryPath);
}
void StorageTracker::deleteOriginOnMainThread(void* originIdentifier)
{
ASSERT(isMainThread());
String identifier = adoptRef(reinterpret_cast<StringImpl*>(originIdentifier));
tracker().deleteOrigin(identifier);
}
void StorageTracker::deleteOrigin(const String& originIdentifier)
{
deleteOrigin(SecurityOrigin::createFromDatabaseIdentifier(originIdentifier).get());
......
......@@ -86,6 +86,7 @@ private:
bool canDeleteOrigin(const String& originIdentifier);
void willDeleteOrigin(const String& originIdentifier);
void willDeleteAllOrigins();
static void deleteOriginOnMainThread(void* originIdentifier);
void originFilePaths(Vector<String>& paths);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment