From 951d4ad06fd0db16a9a21be27294430cc092ac0d Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 5 Feb 2021 11:40:58 -0500 Subject: [PATCH] Prevent narrow race condition when resetting network components. --- .../dependencies/ApplicationDependencies.java | 60 ++++++++++++------- 1 file changed, 37 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java index 3671715a4..f164fe04b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java @@ -95,15 +95,18 @@ public class ApplicationDependencies { } public static @NonNull SignalServiceAccountManager getSignalServiceAccountManager() { - if (accountManager == null) { - synchronized (LOCK) { - if (accountManager == null) { - accountManager = provider.provideSignalServiceAccountManager(); - } - } + SignalServiceAccountManager local = accountManager; + + if (local != null) { + return local; } - return accountManager; + synchronized (LOCK) { + if (accountManager == null) { + accountManager = provider.provideSignalServiceAccountManager(); + } + return accountManager; + } } public static @NonNull GroupsV2Authorization getGroupsV2Authorization() { @@ -152,6 +155,12 @@ public class ApplicationDependencies { } public static @NonNull SignalServiceMessageSender getSignalServiceMessageSender() { + SignalServiceMessageSender local = messageSender; + + if (local != null) { + return local; + } + synchronized (LOCK) { if (messageSender == null) { messageSender = provider.provideSignalServiceMessageSender(); @@ -161,21 +170,23 @@ public class ApplicationDependencies { IncomingMessageObserver.getUnidentifiedPipe(), TextSecurePreferences.isMultiDevice(application)); } + return messageSender; } - - return messageSender; } public static @NonNull SignalServiceMessageReceiver getSignalServiceMessageReceiver() { - if (messageReceiver == null) { - synchronized (LOCK) { - if (messageReceiver == null) { - messageReceiver = provider.provideSignalServiceMessageReceiver(); - } - } + SignalServiceMessageReceiver local = messageReceiver; + + if (local != null) { + return local; } - return messageReceiver; + synchronized (LOCK) { + if (messageReceiver == null) { + messageReceiver = provider.provideSignalServiceMessageReceiver(); + } + return messageReceiver; + } } public static void resetSignalServiceMessageReceiver() { @@ -301,15 +312,18 @@ public class ApplicationDependencies { } public static @NonNull IncomingMessageObserver getIncomingMessageObserver() { - if (incomingMessageObserver == null) { - synchronized (LOCK) { - if (incomingMessageObserver == null) { - incomingMessageObserver = provider.provideIncomingMessageObserver(); - } - } + IncomingMessageObserver local = incomingMessageObserver; + + if (local != null) { + return local; } - return incomingMessageObserver; + synchronized (LOCK) { + if (incomingMessageObserver == null) { + incomingMessageObserver = provider.provideIncomingMessageObserver(); + } + return incomingMessageObserver; + } } public static @NonNull TrimThreadsByDateManager getTrimThreadsByDateManager() {