Prevent nested SQL error handlers.

This commit is contained in:
Greyson Parrelli
2023-11-30 16:25:47 -05:00
committed by Cody Henthorne
parent 1355a4a28d
commit 74619f6f8d

View File

@@ -11,6 +11,7 @@ import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import java.util.concurrent.CountDownLatch import java.util.concurrent.CountDownLatch
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicReference import java.util.concurrent.atomic.AtomicReference
/** /**
@@ -18,8 +19,19 @@ import java.util.concurrent.atomic.AtomicReference
*/ */
@Suppress("ClassName") @Suppress("ClassName")
class SqlCipherErrorHandler(private val databaseName: String) : DatabaseErrorHandler { class SqlCipherErrorHandler(private val databaseName: String) : DatabaseErrorHandler {
companion object {
private val TAG = Log.tag(SqlCipherErrorHandler::class.java)
private val errorHandlingInProgress = AtomicBoolean(false)
}
override fun onCorruption(db: SQLiteDatabase, message: String) { override fun onCorruption(db: SQLiteDatabase, message: String) {
if (errorHandlingInProgress.getAndSet(true)) {
Log.w(TAG, "Error handling already in progress, skipping.")
return
}
try {
val result: DiagnosticResults = runDiagnostics(ApplicationDependencies.getApplication(), db) val result: DiagnosticResults = runDiagnostics(ApplicationDependencies.getApplication(), db)
var lines: List<String> = result.logs.split("\n") var lines: List<String> = result.logs.split("\n")
lines = listOf("Database '$databaseName' corrupted!", "[sqlite] $message", "Diagnostics results:") + lines lines = listOf("Database '$databaseName' corrupted!", "[sqlite] $message", "Diagnostics results:") + lines
@@ -52,6 +64,9 @@ class SqlCipherErrorHandler(private val databaseName: String) : DatabaseErrorHan
attemptToClearFullTextSearchIndex(db) attemptToClearFullTextSearchIndex(db)
throw DatabaseCorruptedError_FailedToRunChecks(lines) throw DatabaseCorruptedError_FailedToRunChecks(lines)
} }
} finally {
errorHandlingInProgress.set(false)
}
} }
/** /**
@@ -184,8 +199,4 @@ class SqlCipherErrorHandler(private val databaseName: String) : DatabaseErrorHan
private class DatabaseCorruptedError_NormalCheckFailsCipherCheckPasses constructor(lines: List<String>) : CustomTraceError(lines) private class DatabaseCorruptedError_NormalCheckFailsCipherCheckPasses constructor(lines: List<String>) : CustomTraceError(lines)
private class DatabaseCorruptedError_NormalCheckPassesCipherCheckFails constructor(lines: List<String>) : CustomTraceError(lines) private class DatabaseCorruptedError_NormalCheckPassesCipherCheckFails constructor(lines: List<String>) : CustomTraceError(lines)
private class DatabaseCorruptedError_FailedToRunChecks constructor(lines: List<String>) : CustomTraceError(lines) private class DatabaseCorruptedError_FailedToRunChecks constructor(lines: List<String>) : CustomTraceError(lines)
companion object {
private val TAG = Log.tag(SqlCipherErrorHandler::class.java)
}
} }