diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.java b/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.java index 7bde9206b..213a84143 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.java @@ -11,6 +11,10 @@ import org.signal.core.util.ExceptionUtil; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.util.CursorUtil; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + /** * The default error handler wipes the file. This one instead prints some diagnostics and then crashes so the original corrupt file isn't lost. */ @@ -61,24 +65,49 @@ public final class SqlCipherErrorHandler implements DatabaseErrorHandler { Log.e(TAG, output.toString()); + List lines = new ArrayList<>(Arrays.asList(output.toString().split("\n"))); + if (pragma1Passes && pragma2Passes) { - throw new DatabaseCorruptedError_BothChecksPass(); + throw new DatabaseCorruptedError_BothChecksPass(lines); } else if (!pragma1Passes && pragma2Passes) { - throw new DatabaseCorruptedError_NormalCheckFailsCipherCheckPasses(); + throw new DatabaseCorruptedError_NormalCheckFailsCipherCheckPasses(lines); } else if (pragma1Passes && !pragma2Passes) { - throw new DatabaseCorruptedError_NormalCheckPassesCipherCheckFails(); + throw new DatabaseCorruptedError_NormalCheckPassesCipherCheckFails(lines); } else { - throw new DatabaseCorruptedError_BothChecksFail(); + throw new DatabaseCorruptedError_BothChecksFail(lines); } } + public static class CustomTraceError extends Error { - public static final class DatabaseCorruptedError_BothChecksPass extends Error { + CustomTraceError(@NonNull List lines) { + StackTraceElement[] custom = lines.stream().map(line -> new StackTraceElement(line, "", "", 0)).toArray(StackTraceElement[]::new); + + setStackTrace(ExceptionUtil.joinStackTrace(getStackTrace(), custom)); + } } - public static final class DatabaseCorruptedError_BothChecksFail extends Error { + + public static final class DatabaseCorruptedError_BothChecksPass extends CustomTraceError { + DatabaseCorruptedError_BothChecksPass(@NonNull List lines) { + super(lines); + } } - public static final class DatabaseCorruptedError_NormalCheckFailsCipherCheckPasses extends Error { + + public static final class DatabaseCorruptedError_BothChecksFail extends CustomTraceError { + DatabaseCorruptedError_BothChecksFail(@NonNull List lines) { + super(lines); + } } - public static final class DatabaseCorruptedError_NormalCheckPassesCipherCheckFails extends Error { + + public static final class DatabaseCorruptedError_NormalCheckFailsCipherCheckPasses extends CustomTraceError { + DatabaseCorruptedError_NormalCheckFailsCipherCheckPasses(@NonNull List lines) { + super(lines); + } + } + + public static final class DatabaseCorruptedError_NormalCheckPassesCipherCheckFails extends CustomTraceError { + DatabaseCorruptedError_NormalCheckPassesCipherCheckFails(@NonNull List lines) { + super(lines); + } } }