From b69ffe4e15004adee36e443770e75164345dd31f Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Mon, 20 Dec 2021 13:05:10 -0500 Subject: [PATCH] Fix crash when processing group updates with remapped members. --- .../securesms/database/GroupDatabase.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java index a6ce6978f7..53492418fa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java @@ -581,7 +581,7 @@ private static final String[] GROUP_PROJECTION = { throw new AssertionError("V2 master key but no group state"); } groupId.requireV2(); - groupMembers = getV2GroupMembers(context, groupState); + groupMembers = getV2GroupMembers(context, groupState, true); contentValues.put(V2_MASTER_KEY, groupMasterKey.serialize()); contentValues.put(V2_REVISION, groupState.getRevision()); contentValues.put(V2_DECRYPTED_GROUP, groupState.toByteArray()); @@ -720,7 +720,7 @@ private static final String[] GROUP_PROJECTION = { contentValues.put(UNMIGRATED_V1_MEMBERS, unmigratedV1Members.isEmpty() ? null : RecipientId.toSerializedList(unmigratedV1Members)); } - List groupMembers = getV2GroupMembers(context, decryptedGroup); + List groupMembers = getV2GroupMembers(context, decryptedGroup, true); contentValues.put(TITLE, title); contentValues.put(V2_REVISION, decryptedGroup.getRevision()); contentValues.put(V2_DECRYPTED_GROUP, decryptedGroup.toByteArray()); @@ -894,12 +894,18 @@ private static final String[] GROUP_PROJECTION = { return groupMembers; } - private static @NonNull List getV2GroupMembers(@NonNull Context context, @NonNull DecryptedGroup decryptedGroup) { + private static @NonNull List getV2GroupMembers(@NonNull Context context, @NonNull DecryptedGroup decryptedGroup, boolean shouldRetry) { List uuids = DecryptedGroupUtil.membersToUuidList(decryptedGroup.getMembersList()); List ids = uuidsToRecipientIds(uuids); if (RemappedRecords.getInstance().areAnyRemapped(ids)) { - throw new IllegalStateException("Remapped records in group membership!"); + if (shouldRetry) { + Log.w(TAG, "Found remapped records where we shouldn't. Clearing cache and trying again."); + RecipientId.clearCache(); + return getV2GroupMembers(context, decryptedGroup, false); + } else { + throw new IllegalStateException("Remapped records in group membership!"); + } } else { return ids; }