From 67007cf6c070ddca49b17a9633c5ae83ded057c5 Mon Sep 17 00:00:00 2001 From: Naveen Albert Date: Thu, 14 Aug 2025 08:50:31 -0400 Subject: [PATCH] bridge.c: Obey BRIDGE_NOANSWER variable to skip answering channel. If the BRIDGE_NOANSWER variable is set on a channel, it is not supposed to answer when another channel bridges to it using Bridge(), and this is checked when ast_bridge_call* is called. However, another path exists (bridge_exec -> ast_bridge_add_channel) where this variable was not checked and channels would be answered. We now check the variable there. Resolves: #401 Resolves: #1364 (cherry picked from commit 3ea3ec6f0aaebe7bc057bab584f11ef0e7171514) --- main/bridge.c | 12 +++++++++++- main/features.c | 3 +++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/main/bridge.c b/main/bridge.c index 46526aea07..cc2183b526 100644 --- a/main/bridge.c +++ b/main/bridge.c @@ -2578,6 +2578,8 @@ int ast_bridge_add_channel(struct ast_bridge *bridge, struct ast_channel *chan, ast_bridge_unlock(chan_bridge); ast_bridge_unlock(bridge); } else { + int noanswer; + const char *value; /* Slightly less easy case. We need to yank channel A from * where he currently is and impart him into our bridge. */ @@ -2587,9 +2589,17 @@ int ast_bridge_add_channel(struct ast_bridge *bridge, struct ast_channel *chan, ast_bridge_features_destroy(features); return -1; } - if (ast_channel_state(yanked_chan) != AST_STATE_UP) { + + ast_channel_lock(chan); + value = pbx_builtin_getvar_helper(chan, "BRIDGE_NOANSWER"); + noanswer = !ast_strlen_zero(value) ? 1 : 0; + ast_channel_unlock(chan); + if (noanswer) { + ast_debug(3, "Skipping answer on bridge target channel %s\n", ast_channel_name(chan)); + } else if (ast_channel_state(yanked_chan) != AST_STATE_UP) { ast_answer(yanked_chan); } + ast_channel_ref(yanked_chan); if (ast_bridge_impart(bridge, yanked_chan, NULL, features, AST_BRIDGE_IMPART_CHAN_INDEPENDENT)) { diff --git a/main/features.c b/main/features.c index 9b4cf34221..a643473996 100644 --- a/main/features.c +++ b/main/features.c @@ -172,6 +172,9 @@ Additionally, to prevent a bridged channel (the target of the Bridge application) from answering, the BRIDGE_NOANSWER variable can be set to inhibit answering. + Do not set the BRIDGE_NOANSWER variable globally, + as it will break normal bridging behavior in many cases. Only use this variable on + a per-channel basis when you really know what you are doing!