]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
bridge.c: Hangup attended transfer target if bridged 67/2667/1
authorKevin Harwell <kharwell@digium.com>
Mon, 22 Jun 2015 20:11:18 +0000 (15:11 -0500)
committerRichard Mudgett <rmudgett@digium.com>
Wed, 20 Apr 2016 21:52:21 +0000 (16:52 -0500)
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

index f621942cec291dd6ae53a4cfa9353152c530777b..0925ac15e02e9565d52544345bb83a022c9eb9d7 100644 (file)
@@ -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;