From 577c69cfdabca1c50e6843032e1fe8e3e60857e4 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 3c5e87b574..34dd7feeb6 100644
--- a/main/bridge_channel.c
+++ b/main/bridge_channel.c
@@ -3013,6 +3013,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