From 7d8e43233d6a8b4e3277a13426623a0b0586b538 Mon Sep 17 00:00:00 2001
From: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
Date: Wed, 29 Apr 2020 11:51:20 -0400
Subject: [PATCH] call: avoid deadlock on hangup

This patch move checkAudio() out of call mutex. Because it could cause
deadlock if subcallStateChanged() called at the same time.

Change-Id: Iee06874fb79c8e0953e061f7a669b3f61f13d8b9
---
 src/call.cpp        |  1 -
 src/sip/sipcall.cpp | 15 +++++++++------
 2 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/call.cpp b/src/call.cpp
index eca7f5ab36..b75637c6ca 100644
--- a/src/call.cpp
+++ b/src/call.cpp
@@ -152,7 +152,6 @@ Call::removeCall()
     setState(CallState::OVER);
     if (Recordable::isRecording())
         Recordable::stopRecording();
-    Manager::instance().checkAudio();
 }
 
 const std::string&
diff --git a/src/sip/sipcall.cpp b/src/sip/sipcall.cpp
index 4732252d0a..cf541fc855 100644
--- a/src/sip/sipcall.cpp
+++ b/src/sip/sipcall.cpp
@@ -763,12 +763,15 @@ SIPCall::sendTextMessage(const std::map<std::string, std::string>& messages,
 void
 SIPCall::removeCall()
 {
-    std::lock_guard<std::recursive_mutex> lk {callMutex_};
-    JAMI_WARN("[call:%s] removeCall()", getCallId().c_str());
-    Call::removeCall();
-    mediaTransport_.reset();
-    inv.reset();
-    setTransport({});
+    {
+        std::lock_guard<std::recursive_mutex> lk {callMutex_};
+        JAMI_WARN("[call:%s] removeCall()", getCallId().c_str());
+        Call::removeCall();
+        mediaTransport_.reset();
+        inv.reset();
+        setTransport({});
+    }
+    Manager::instance().checkAudio();
 }
 
 void
-- 
GitLab