From 69423bcad89caca8c5ddd856f36809c1b0da2268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damian=20Kr=C3=B3lik?= <66667989+Damian-Nordic@users.noreply.github.com> Date: Fri, 29 Oct 2021 19:35:36 +0200 Subject: [PATCH] [android] Fix deadlock in DNS-SD callback (#11186) --- src/platform/android/DnssdImpl.cpp | 32 ++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/platform/android/DnssdImpl.cpp b/src/platform/android/DnssdImpl.cpp index 8d5b5c4e2c81d2..f0a0bace59ebb7 100644 --- a/src/platform/android/DnssdImpl.cpp +++ b/src/platform/android/DnssdImpl.cpp @@ -17,18 +17,18 @@ #include "DnssdImpl.h" -#include -#include -#include -#include -#include - #include +#include #include #include +#include +#include #include #include +#include +#include +#include #include namespace chip { @@ -65,7 +65,10 @@ CHIP_ERROR ChipDnssdRemoveServices() VerifyOrReturnError(sResolverObject != nullptr && sRemoveServicesMethod != nullptr, CHIP_ERROR_INCORRECT_STATE); JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); - env->CallVoidMethod(sResolverObject, sRemoveServicesMethod); + { + DeviceLayer::StackUnlock unlock; + env->CallVoidMethod(sResolverObject, sRemoveServicesMethod); + } if (env->ExceptionCheck()) { @@ -114,8 +117,11 @@ CHIP_ERROR ChipDnssdPublishService(const DnssdService * service) env->SetObjectArrayElement(subTypes, i, jniSubType.jniValue()); } - env->CallVoidMethod(sResolverObject, sPublishMethod, jniName.jniValue(), jniHostName.jniValue(), jniServiceType.jniValue(), - service->mPort, keys, datas, subTypes); + { + DeviceLayer::StackUnlock unlock; + env->CallVoidMethod(sResolverObject, sPublishMethod, jniName.jniValue(), jniHostName.jniValue(), jniServiceType.jniValue(), + service->mPort, keys, datas, subTypes); + } if (env->ExceptionCheck()) { @@ -154,8 +160,11 @@ CHIP_ERROR ChipDnssdResolve(DnssdService * service, Inet::InterfaceId interface, UtfString jniInstanceName(env, service->mName); UtfString jniServiceType(env, serviceType.c_str()); - env->CallVoidMethod(sResolverObject, sResolveMethod, jniInstanceName.jniValue(), jniServiceType.jniValue(), - reinterpret_cast(callback), reinterpret_cast(context), sMdnsCallbackObject); + { + DeviceLayer::StackUnlock unlock; + env->CallVoidMethod(sResolverObject, sResolveMethod, jniInstanceName.jniValue(), jniServiceType.jniValue(), + reinterpret_cast(callback), reinterpret_cast(context), sMdnsCallbackObject); + } if (env->ExceptionCheck()) { @@ -209,6 +218,7 @@ void HandleResolve(jstring instanceName, jstring serviceType, jstring address, j VerifyOrReturn(callbackHandle != 0, ChipLogError(Discovery, "HandleResolve called with callback equal to nullptr")); const auto dispatch = [callbackHandle, contextHandle](CHIP_ERROR error, DnssdService * service = nullptr) { + DeviceLayer::StackLock lock; DnssdResolveCallback callback = reinterpret_cast(callbackHandle); callback(reinterpret_cast(contextHandle), service, error); };