mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-22 12:08:34 +00:00
Prevent nested SQL error handlers.
This commit is contained in:
committed by
Cody Henthorne
parent
1355a4a28d
commit
74619f6f8d
@@ -11,6 +11,7 @@ import org.signal.core.util.logging.Log
|
||||
import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider
|
||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
||||
import java.util.concurrent.CountDownLatch
|
||||
import java.util.concurrent.atomic.AtomicBoolean
|
||||
import java.util.concurrent.atomic.AtomicReference
|
||||
|
||||
/**
|
||||
@@ -18,8 +19,19 @@ import java.util.concurrent.atomic.AtomicReference
|
||||
*/
|
||||
@Suppress("ClassName")
|
||||
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) {
|
||||
if (errorHandlingInProgress.getAndSet(true)) {
|
||||
Log.w(TAG, "Error handling already in progress, skipping.")
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
val result: DiagnosticResults = runDiagnostics(ApplicationDependencies.getApplication(), db)
|
||||
var lines: List<String> = result.logs.split("\n")
|
||||
lines = listOf("Database '$databaseName' corrupted!", "[sqlite] $message", "Diagnostics results:") + lines
|
||||
@@ -52,6 +64,9 @@ class SqlCipherErrorHandler(private val databaseName: String) : DatabaseErrorHan
|
||||
attemptToClearFullTextSearchIndex(db)
|
||||
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_NormalCheckPassesCipherCheckFails 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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user