diff --git a/xplat/Flipper/FlipperClient.cpp b/xplat/Flipper/FlipperClient.cpp index 44659fc40..8a926b3b2 100644 --- a/xplat/Flipper/FlipperClient.cpp +++ b/xplat/Flipper/FlipperClient.cpp @@ -167,7 +167,7 @@ void FlipperClient::onMessageReceived( // plugin, and still use it to respond with an error if we catch an exception. std::shared_ptr responder = std::move(uniqueResponder); try { - std::lock_guard lock(mutex_); + std::unique_lock lock(mutex_); const auto& method = message["method"]; const auto& params = message.getDefault("params"); @@ -233,7 +233,12 @@ void FlipperClient::onMessageReceived( "name", "ConnectionNotFound")); return; } - const auto& conn = connections_.at(params["api"].getString()); + const auto conn = connections_.at(params["api"].getString()); + + // conn->call(...) may call back to FlipperClient causing a deadlock (see + // T92341964). Making sure the mutex is not locked. + lock.unlock(); + conn->call( params["method"].getString(), params.getDefault("params"), responder); return;