mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-02 03:02:04 +00:00
bridge_channel: don't set cause code on channel during bridge delete if already set
Due to a potential race condition via ARI when hanging up a channel hangup with cause
while also deleting a bridge containing that channel, the bridge delete can over-write
the hangup cause code resulting in Normal Call Clearing instead of the set value.
With this change, bridge deletion will only set the hangup code if it hasn't been
previously set.
Resolves: #1124
(cherry picked from commit 4a563b6b8d
)
This commit is contained in:
committed by
Asterisk Development Team
parent
2c74f2d774
commit
1bb204b70b
@@ -278,13 +278,23 @@ static void bridge_channel_poke(struct ast_bridge_channel *bridge_channel)
|
||||
*/
|
||||
static int channel_set_cause(struct ast_channel *chan, int cause)
|
||||
{
|
||||
int current_cause;
|
||||
ast_channel_lock(chan);
|
||||
current_cause = ast_channel_hangupcause(chan);
|
||||
|
||||
/* if the hangupcause is already set, leave it */
|
||||
if (current_cause > 0) {
|
||||
ast_channel_unlock(chan);
|
||||
return current_cause;
|
||||
}
|
||||
|
||||
if (cause <= 0) {
|
||||
cause = ast_channel_hangupcause(chan);
|
||||
if (cause <= 0) {
|
||||
cause = AST_CAUSE_NORMAL_CLEARING;
|
||||
}
|
||||
}
|
||||
|
||||
ast_channel_hangupcause_set(chan, cause);
|
||||
ast_channel_unlock(chan);
|
||||
return cause;
|
||||
|
Reference in New Issue
Block a user