From ea462c003c610ca99fae42a9ba27c6c680a822cd Mon Sep 17 00:00:00 2001
From: Grzegorz Sluja <grzegorz.sluja@iopsys.eu>
Date: Tue, 30 Mar 2021 10:56:40 +0200
Subject: [PATCH] Do not leave channels with Ref > 2 after call transfer

Since we modified asterisk default implementation of attended call
transfer there was an issue with channels stuck (not destroyed)
afterwards, It was caused due to Ref count for channels used in call
transfer was greater than 2.

Signed-off-by: Grzegorz Sluja <grzegorz.sluja@iopsys.eu>
---
 main/bridge_channel.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/main/bridge_channel.c b/main/bridge_channel.c
index 7e058af3c0..9d3934fae5 100644
--- a/main/bridge_channel.c
+++ b/main/bridge_channel.c
@@ -3017,6 +3017,9 @@ int bridge_channel_internal_join(struct ast_bridge_channel *bridge_channel)
 		ast_debug(1, "Channel %s simulating UNHOLD for bridge end.\n",
 			ast_channel_name(bridge_channel->chan));
 		ast_indicate(bridge_channel->chan, AST_CONTROL_UNHOLD);
+		// leaving channel with Ref > 2 cause it is not destroyed during hangup
+		while (2 < ao2_ref(bridge_channel->chan, 0))
+			ao2_ref(bridge_channel->chan, -1);
 	}
 
 	/* Complete any partial DTMF digit before exiting the bridge. */
-- 
GitLab