From 6d78e1760d3825dd35af7fa2f2fda5afbcc6d94d Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 25 Nov 2019 10:50:05 -0500 Subject: [PATCH] Fix possible crash in very old database migration. The NumberMigrator constructor is crashing. One possibility is that this migration is running before the user registered, in which case they wouldn't have a number. Wrapped the parts that don't need to run in this situation in an `if` block. --- .../database/helpers/ClassicOpenHelper.java | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/org/thoughtcrime/securesms/database/helpers/ClassicOpenHelper.java b/src/org/thoughtcrime/securesms/database/helpers/ClassicOpenHelper.java index e9e4e0909..280dcc823 100644 --- a/src/org/thoughtcrime/securesms/database/helpers/ClassicOpenHelper.java +++ b/src/org/thoughtcrime/securesms/database/helpers/ClassicOpenHelper.java @@ -789,7 +789,7 @@ public class ClassicOpenHelper extends SQLiteOpenHelper { db.execSQL("UPDATE part SET pending_push = '2' WHERE pending_push = '1'"); } - if (oldVersion < NO_MORE_CANONICAL_ADDRESS_DATABASE) { + if (oldVersion < NO_MORE_CANONICAL_ADDRESS_DATABASE && !TextUtils.isEmpty(TextSecurePreferences.getLocalNumber(context))) { SQLiteOpenHelper canonicalAddressDatabaseHelper = new SQLiteOpenHelper(context, "canonical_address.db", null, 1) { @Override public void onCreate(SQLiteDatabase db) { @@ -1186,24 +1186,26 @@ public class ClassicOpenHelper extends SQLiteOpenHelper { if (oldVersion < INTERNAL_DIRECTORY) { db.execSQL("ALTER TABLE recipient_preferences ADD COLUMN registered INTEGER DEFAULT 0"); - OldDirectoryDatabaseHelper directoryDatabaseHelper = new OldDirectoryDatabaseHelper(context); - SQLiteDatabase directoryDatabase = directoryDatabaseHelper.getWritableDatabase(); + if (!TextUtils.isEmpty(TextSecurePreferences.getLocalNumber(context))) { + OldDirectoryDatabaseHelper directoryDatabaseHelper = new OldDirectoryDatabaseHelper(context); + SQLiteDatabase directoryDatabase = directoryDatabaseHelper.getWritableDatabase(); - Cursor cursor = directoryDatabase.query("directory", new String[] {"number", "registered"}, null, null, null, null, null); + Cursor cursor = directoryDatabase.query("directory", new String[] {"number", "registered"}, null, null, null, null, null); - while (cursor != null && cursor.moveToNext()) { - String address = new NumberMigrator(TextSecurePreferences.getLocalNumber(context)).migrate(cursor.getString(0)); - ContentValues contentValues = new ContentValues(1); + while (cursor != null && cursor.moveToNext()) { + String address = new NumberMigrator(TextSecurePreferences.getLocalNumber(context)).migrate(cursor.getString(0)); + ContentValues contentValues = new ContentValues(1); - contentValues.put("registered", cursor.getInt(1) == 1 ? 1 : 2); + contentValues.put("registered", cursor.getInt(1) == 1 ? 1 : 2); - if (db.update("recipient_preferences", contentValues, "recipient_ids = ?", new String[] {address}) < 1) { - contentValues.put("recipient_ids", address); - db.insert("recipient_preferences", null, contentValues); + if (db.update("recipient_preferences", contentValues, "recipient_ids = ?", new String[] {address}) < 1) { + contentValues.put("recipient_ids", address); + db.insert("recipient_preferences", null, contentValues); + } } - } - if (cursor != null) cursor.close(); + if (cursor != null) cursor.close(); + } } if (oldVersion < INTERNAL_SYSTEM_DISPLAY_NAME) {