diff options
author | Jonathan Rose <jrose@digium.com> | 2014-08-13 16:24:37 +0000 |
---|---|---|
committer | Jonathan Rose <jrose@digium.com> | 2014-08-13 16:24:37 +0000 |
commit | d4695774e7ef3b4699b8283f175d161cd19e3d25 (patch) | |
tree | 4f59a5f5dc0094ffbe928dd21b6095defa056832 /main/channel.c | |
parent | 6a6702bb0fff957c0264e872fe0760efe21a1e20 (diff) |
Bridges: Fix feature interruption/unintended kick caused by external actions
If a manager or CLI user attached a mixmonitor to a call running a dynamic
bridge feature while in a bridge, the feature would be interrupted and the
channel would be forcibly kicked out of the bridge (usually ending the call
during a simple 1 to 1 call). This would also occur during any similar action
that could set the unbridge soft hangup flag, so the fix for this was to
remove unbridge from the soft hangup flags and make it a separate thing all
together.
ASTERISK-24027 #close
Reported by: mjordan
Review: https://reviewboard.asterisk.org/r/3900/
........
Merged revisions 420934 from http://svn.asterisk.org/svn/asterisk/branches/12
........
Merged revisions 420940 from http://svn.asterisk.org/svn/asterisk/branches/13
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@420947 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/channel.c')
-rw-r--r-- | main/channel.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/main/channel.c b/main/channel.c index 50b9e8726..5681ec1a5 100644 --- a/main/channel.c +++ b/main/channel.c @@ -10217,11 +10217,11 @@ int ast_channel_is_bridged(const struct ast_channel *chan) int ast_channel_is_leaving_bridge(struct ast_channel *chan) { int hangup_flags = ast_channel_softhangup_internal_flag(chan); - int hangup_test = hangup_flags & (AST_SOFTHANGUP_ASYNCGOTO | AST_SOFTHANGUP_UNBRIDGE); + int hangup_test = hangup_flags & AST_SOFTHANGUP_ASYNCGOTO; - /* This function should only return true if either ASYNCGOTO - * or UNBRIDGE is set, or both flags are set. It should return - * false if any other flag is set. + /* This function should only return true if only the ASYNCGOTO + * is set. It should false if any other flag is set or if the + * ASYNCGOTO flag is not set. */ return (hangup_test && (hangup_test == hangup_flags)); } @@ -10518,7 +10518,7 @@ void ast_channel_end_dtmf(struct ast_channel *chan, char digit, struct timeval s ast_channel_lock(chan); dead = ast_test_flag(ast_channel_flags(chan), AST_FLAG_ZOMBIE) || (ast_channel_softhangup_internal_flag(chan) - & ~(AST_SOFTHANGUP_ASYNCGOTO | AST_SOFTHANGUP_UNBRIDGE)); + & ~AST_SOFTHANGUP_ASYNCGOTO); ast_channel_unlock(chan); if (dead) { /* Channel is a zombie or a real hangup. */ |