diff --git a/messaging/src/android/cpp/messaging.cc b/messaging/src/android/cpp/messaging.cc index c0ad63040f..43c8035d71 100644 --- a/messaging/src/android/cpp/messaging.cc +++ b/messaging/src/android/cpp/messaging.cc @@ -124,6 +124,9 @@ static std::string* g_lockfile_path; static Mutex* g_file_locker_mutex; +// Mutex for managing if FutureData is safe to use, or if it has been deleted. +static Mutex g_future_data_mutex; + static const char* kMessagingNotInitializedError = "Messaging not initialized."; static void HandlePendingSubscriptions(); @@ -706,7 +709,10 @@ void Terminate() { SetListener(nullptr); ReleaseClasses(env); util::Terminate(env); - FutureData::Destroy(); + { + MutexLock lock(g_future_data_mutex); + FutureData::Destroy(); + } } // Start a service which will communicate with the Firebase Cloud Messaging @@ -826,8 +832,13 @@ static void CompleteVoidCallback(JNIEnv* env, jobject result, FutureHandle handle(future_id); Error error = (result_code == util::kFutureResultSuccess) ? kErrorNone : kErrorUnknown; - ReferenceCountedFutureImpl* api = FutureData::Get()->api(); - api->Complete(handle, error, status_message); + MutexLock lock(g_future_data_mutex); + if (FutureData::Get() && FutureData::Get()->api()) { + ReferenceCountedFutureImpl* api = FutureData::Get()->api(); + api->Complete(handle, error, status_message); + } else { + LogWarning("Failed to complete Future as it was likely already deleted."); + } if (result) env->DeleteLocalRef(result); } @@ -843,8 +854,13 @@ static void CompleteStringCallback(JNIEnv* env, jobject result, SafeFutureHandle* handle = reinterpret_cast*>(callback_data); Error error = success ? kErrorNone : kErrorUnknown; - ReferenceCountedFutureImpl* api = FutureData::Get()->api(); - api->CompleteWithResult(*handle, error, status_message, result_value); + MutexLock lock(g_future_data_mutex); + if (FutureData::Get() && FutureData::Get()->api()) { + ReferenceCountedFutureImpl* api = FutureData::Get()->api(); + api->CompleteWithResult(*handle, error, status_message, result_value); + } else { + LogWarning("Failed to complete Future as it was likely already deleted."); + } delete handle; } diff --git a/release_build_files/readme.md b/release_build_files/readme.md index 40ca9790f0..fb3f8972e6 100644 --- a/release_build_files/readme.md +++ b/release_build_files/readme.md @@ -634,8 +634,10 @@ code. ### Upcoming Release - Changes - Analytics (iOS): Add support for - `InitiateOnDeviceConversionMeasurementWithHashedEmailAddress` and - `InitiateOnDeviceConversionMeasurementWithHashedPhoneNumber`. + `InitiateOnDeviceConversionMeasurementWithHashedEmailAddress` and + `InitiateOnDeviceConversionMeasurementWithHashedPhoneNumber`. + - Messaging (Android): Addressed potential race condition on receiving + messages after cleanup. ### 12.0.0 - Changes