From ac53e65cb5fb74bc83a9ddec5c73c0b65a2538dd Mon Sep 17 00:00:00 2001 From: Kevin Harwell Date: Mon, 22 Jun 2015 15:11:18 -0500 Subject: [PATCH] bridge.c: Hangup attended transfer target if bridged After completing an attended transfer the transfer target channel was not being hung up after leaving the bridge. Added an explicit softhangup to hangup said channel, but only if it was previously bridged. ASTERISK-24782 #close Reported by: John Bigelow This patch is a remedial cherry-pick from v13. Change-Id: Idde9543d56842369384a5e8c00d72a22bbc39ada --- main/bridge.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/main/bridge.c b/main/bridge.c index f621942cec..0925ac15e0 100644 --- a/main/bridge.c +++ b/main/bridge.c @@ -4461,6 +4461,7 @@ enum ast_transfer_result ast_bridge_transfer_attended(struct ast_channel *to_tra int do_bridge_transfer; enum ast_transfer_result res; const char *app = NULL; + int hangup_target = 0; to_transferee_bridge = acquire_bridge(to_transferee); to_target_bridge = acquire_bridge(to_transfer_target); @@ -4540,7 +4541,7 @@ enum ast_transfer_result ast_bridge_transfer_attended(struct ast_channel *to_tra ast_bridge_unlock(to_transferee_bridge); ast_bridge_unlock(to_target_bridge); - ast_softhangup(to_transfer_target, AST_SOFTHANGUP_DEV); + hangup_target = 1; goto end; } @@ -4583,6 +4584,11 @@ enum ast_transfer_result ast_bridge_transfer_attended(struct ast_channel *to_tra set_transfer_variables_all(to_transferee, channels, 1); if (do_bridge_transfer) { + /* + * Hang up the target if it was bridged. Note, if it is not bridged + * it is hung up during the masquerade. + */ + hangup_target = chan_bridged == to_transfer_target; ast_bridge_lock(the_bridge); res = attended_transfer_bridge(chan_bridged, chan_unbridged, the_bridge, NULL, transfer_msg); ast_bridge_unlock(the_bridge); @@ -4606,6 +4612,10 @@ enum ast_transfer_result ast_bridge_transfer_attended(struct ast_channel *to_tra res = AST_BRIDGE_TRANSFER_SUCCESS; end: + if (res == AST_BRIDGE_TRANSFER_SUCCESS && hangup_target) { + ast_softhangup(to_transfer_target, AST_SOFTHANGUP_DEV); + } + transfer_msg->result = res; ast_bridge_publish_attended_transfer(transfer_msg); return res; -- 2.47.2