From dc9637b1272500db4ee917715809b113cdcd573a Mon Sep 17 00:00:00 2001 From: Evan Hahn Date: Mon, 19 Dec 2022 13:15:05 -0600 Subject: [PATCH] Handle SQLite corruption during database initialization GRDB executes some simple statements when initializing a `DatabasePool` object (see [1][], [2][], [3][], [4][]). If any of those fail with a corruption error, we should flag the database as corrupted. This will let the user attempt recovery. [1]: https://github.com/groue/GRDB.swift/blob/23f4254ae36fa19aecd73047c0577a9f49850d1c/GRDB/Core/Database.swift#L365 [2]: https://github.com/groue/GRDB.swift/blob/23f4254ae36fa19aecd73047c0577a9f49850d1c/GRDB/Core/DatabasePool.swift#L75 [3]: https://github.com/groue/GRDB.swift/blob/23f4254ae36fa19aecd73047c0577a9f49850d1c/GRDB/Core/DatabasePool.swift#L82 [4]: https://github.com/groue/GRDB.swift/blob/23f4254ae36fa19aecd73047c0577a9f49850d1c/GRDB/Core/DatabasePool.swift#L91-L94 --- .../src/Storage/Database/GRDBDatabaseStorageAdapter.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/SignalServiceKit/src/Storage/Database/GRDBDatabaseStorageAdapter.swift b/SignalServiceKit/src/Storage/Database/GRDBDatabaseStorageAdapter.swift index 0685600984..389e965576 100644 --- a/SignalServiceKit/src/Storage/Database/GRDBDatabaseStorageAdapter.swift +++ b/SignalServiceKit/src/Storage/Database/GRDBDatabaseStorageAdapter.swift @@ -110,6 +110,10 @@ public class GRDBDatabaseStorageAdapter: NSObject { // Crash if storage can't be initialized. storage = try GRDBStorage(dbURL: databaseFileUrl, keyspec: GRDBDatabaseStorageAdapter.keyspec) } catch { + DatabaseCorruptionState.flagDatabaseCorruptionIfNecessary( + userDefaults: CurrentAppContext().appUserDefaults(), + error: error + ) owsFail("\(error.grdbErrorForLogging)") }