From 4b3e7c885889fec754c44c419f142520820d22ec Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Sun, 28 Feb 2021 10:37:27 -0500 Subject: [PATCH] Remove SELF_LOCK from LiveRecipientCache. Had the potential to deadlock if accessed inside of a database transaction. --- .../securesms/recipients/LiveRecipientCache.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipientCache.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipientCache.java index 39f71cbfb9..de3c95253c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipientCache.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/LiveRecipientCache.java @@ -9,6 +9,7 @@ import androidx.annotation.NonNull; import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; +import org.thoughtcrime.securesms.crypto.DatabaseSessionLock; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.RecipientDatabase; import org.thoughtcrime.securesms.database.RecipientDatabase.MissingRecipientException; @@ -16,6 +17,7 @@ import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.database.model.ThreadRecord; import org.thoughtcrime.securesms.util.LRUCache; import org.thoughtcrime.securesms.util.TextSecurePreferences; +import org.whispersystems.signalservice.api.SignalSessionLock; import java.util.ArrayList; import java.util.Collection; @@ -30,14 +32,11 @@ public final class LiveRecipientCache { private static final int CACHE_MAX = 1000; private static final int CACHE_WARM_MAX = 500; - private static final Object SELF_LOCK = new Object(); - private final Context context; private final RecipientDatabase recipientDatabase; private final Map recipients; private final LiveRecipient unknown; - @GuardedBy("SELF_LOCK") private RecipientId localRecipientId; private boolean warmedUp; @@ -111,7 +110,7 @@ public final class LiveRecipientCache { } @NonNull Recipient getSelf() { - synchronized (SELF_LOCK) { + try (SignalSessionLock.Lock unused = DatabaseSessionLock.INSTANCE.acquire()) { if (localRecipientId == null) { UUID localUuid = TextSecurePreferences.getLocalUuid(context); String localE164 = TextSecurePreferences.getLocalNumber(context);