From ee09b289abb0971ba631fc26b171fd4aa333a08c Mon Sep 17 00:00:00 2001 From: Mike Bradeen Date: Tue, 18 Feb 2025 15:17:07 -0700 Subject: [PATCH] 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 7e694417ad6ff7016b29d113f8ab92334a57313d) --- main/bridge_channel.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/main/bridge_channel.c b/main/bridge_channel.c index 4aebb01b5e..e2175959bf 100644 --- a/main/bridge_channel.c +++ b/main/bridge_channel.c @@ -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;