Skip to content

Commit 3cbccb4

Browse files
authored
Add null checks in Messaging task completions (#1602)
* Add null checks in Messaging task completions * Add mutex and update readme * Update messaging.cc
1 parent 4f6daf7 commit 3cbccb4

File tree

2 files changed

+25
-7
lines changed

2 files changed

+25
-7
lines changed

messaging/src/android/cpp/messaging.cc

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ static std::string* g_lockfile_path;
124124

125125
static Mutex* g_file_locker_mutex;
126126

127+
// Mutex for managing if FutureData is safe to use, or if it has been deleted.
128+
static Mutex g_future_data_mutex;
129+
127130
static const char* kMessagingNotInitializedError = "Messaging not initialized.";
128131

129132
static void HandlePendingSubscriptions();
@@ -706,7 +709,10 @@ void Terminate() {
706709
SetListener(nullptr);
707710
ReleaseClasses(env);
708711
util::Terminate(env);
709-
FutureData::Destroy();
712+
{
713+
MutexLock lock(g_future_data_mutex);
714+
FutureData::Destroy();
715+
}
710716
}
711717

712718
// Start a service which will communicate with the Firebase Cloud Messaging
@@ -826,8 +832,13 @@ static void CompleteVoidCallback(JNIEnv* env, jobject result,
826832
FutureHandle handle(future_id);
827833
Error error =
828834
(result_code == util::kFutureResultSuccess) ? kErrorNone : kErrorUnknown;
829-
ReferenceCountedFutureImpl* api = FutureData::Get()->api();
830-
api->Complete(handle, error, status_message);
835+
MutexLock lock(g_future_data_mutex);
836+
if (FutureData::Get() && FutureData::Get()->api()) {
837+
ReferenceCountedFutureImpl* api = FutureData::Get()->api();
838+
api->Complete(handle, error, status_message);
839+
} else {
840+
LogWarning("Failed to complete Future as it was likely already deleted.");
841+
}
831842
if (result) env->DeleteLocalRef(result);
832843
}
833844

@@ -843,8 +854,13 @@ static void CompleteStringCallback(JNIEnv* env, jobject result,
843854
SafeFutureHandle<std::string>* handle =
844855
reinterpret_cast<SafeFutureHandle<std::string>*>(callback_data);
845856
Error error = success ? kErrorNone : kErrorUnknown;
846-
ReferenceCountedFutureImpl* api = FutureData::Get()->api();
847-
api->CompleteWithResult(*handle, error, status_message, result_value);
857+
MutexLock lock(g_future_data_mutex);
858+
if (FutureData::Get() && FutureData::Get()->api()) {
859+
ReferenceCountedFutureImpl* api = FutureData::Get()->api();
860+
api->CompleteWithResult(*handle, error, status_message, result_value);
861+
} else {
862+
LogWarning("Failed to complete Future as it was likely already deleted.");
863+
}
848864
delete handle;
849865
}
850866

release_build_files/readme.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -634,8 +634,10 @@ code.
634634
### Upcoming Release
635635
- Changes
636636
- Analytics (iOS): Add support for
637-
`InitiateOnDeviceConversionMeasurementWithHashedEmailAddress` and
638-
`InitiateOnDeviceConversionMeasurementWithHashedPhoneNumber`.
637+
`InitiateOnDeviceConversionMeasurementWithHashedEmailAddress` and
638+
`InitiateOnDeviceConversionMeasurementWithHashedPhoneNumber`.
639+
- Messaging (Android): Addressed potential race condition on receiving
640+
messages after cleanup.
639641

640642
### 12.0.0
641643
- Changes

0 commit comments

Comments
 (0)