Title: [131672] trunk/Source/WebCore
Revision
131672
Author
dgro...@chromium.org
Date
2012-10-17 17:02:25 -0700 (Wed, 17 Oct 2012)

Log Message

IndexedDB: Destroy leveldb directory if unknown schema is detected
https://bugs.webkit.org/show_bug.cgi?id=99636

Reviewed by Tony Chang.

chromium browser test in progress at
https://codereview.chromium.org/11196029

* Modules/indexeddb/IDBLevelDBBackingStore.cpp:
(WebCore):
(WebCore::isSchemaKnown):
Return true when the schema key doesn't exist because new databases
won't have one.

(WebCore::setUpMetadata):
(WebCore::IDBLevelDBBackingStore::open):
Piggy-back on existing leveldb::destroy code.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (131671 => 131672)


--- trunk/Source/WebCore/ChangeLog	2012-10-18 00:00:55 UTC (rev 131671)
+++ trunk/Source/WebCore/ChangeLog	2012-10-18 00:02:25 UTC (rev 131672)
@@ -1,3 +1,23 @@
+2012-10-17  David Grogan  <dgro...@chromium.org>
+
+        IndexedDB: Destroy leveldb directory if unknown schema is detected
+        https://bugs.webkit.org/show_bug.cgi?id=99636
+
+        Reviewed by Tony Chang.
+
+        chromium browser test in progress at
+        https://codereview.chromium.org/11196029
+
+        * Modules/indexeddb/IDBLevelDBBackingStore.cpp:
+        (WebCore):
+        (WebCore::isSchemaKnown):
+        Return true when the schema key doesn't exist because new databases
+        won't have one.
+
+        (WebCore::setUpMetadata):
+        (WebCore::IDBLevelDBBackingStore::open):
+        Piggy-back on existing leveldb::destroy code.
+
 2012-10-17  Arpita Bahuguna  <arpitabahug...@gmail.com>
 
         Incorrect rendering of borders on <col> with span > 1

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBBackingStore.cpp (131671 => 131672)


--- trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBBackingStore.cpp	2012-10-18 00:00:55 UTC (rev 131671)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBLevelDBBackingStore.cpp	2012-10-18 00:02:25 UTC (rev 131672)
@@ -146,9 +146,18 @@
     virtual const char* name() const { return "idb_cmp1"; }
 };
 
+const int64_t latestSchemaVersion = 1;
+static bool isSchemaKnown(LevelDBDatabase* db)
+{
+    int64_t schemaVersion = 0;
+    const Vector<char> metaDataKey = SchemaVersionKey::encode();
+    if (!getInt(db, metaDataKey, schemaVersion))
+        return true;
+    return schemaVersion <= latestSchemaVersion;
+}
+
 static bool setUpMetadata(LevelDBDatabase* db, const String& origin)
 {
-    const int64_t latestSchemaVersion = 1;
     const Vector<char> metaDataKey = SchemaVersionKey::encode();
 
     int64_t schemaVersion = 0;
@@ -157,6 +166,7 @@
         if (!putInt(db, metaDataKey, latestSchemaVersion))
             return false;
     } else {
+        ASSERT(schemaVersion <= latestSchemaVersion);
         if (!schemaVersion) {
             schemaVersion = latestSchemaVersion;
             RefPtr<LevelDBTransaction> transaction = LevelDBTransaction::create(db);
@@ -248,8 +258,11 @@
         String path = pathByAppendingComponent(pathBase, securityOrigin->databaseIdentifier() + ".indexeddb.leveldb");
 
         db = LevelDBDatabase::open(path, comparator.get());
+        bool knownSchema = isSchemaKnown(db.get());
+        if (!knownSchema)
+            LOG_ERROR("IndexedDB backing store had unknown schema, treating it as failure to open");
 
-        if (!db) {
+        if (!db || !knownSchema) {
             LOG_ERROR("IndexedDB backing store open failed, attempting cleanup");
             bool success = LevelDBDatabase::destroy(path);
             if (!success) {
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to