mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-03 11:25:35 +00:00
Unset BRIDGEPEER when leaving a bridge
Currently if a channel is transferred out of a bridge, the BRIDGEPEER variable (also BRIDGEPVTCALLID) remain set even once the channel is out of the bridge. This patch removes these variables when leaving the bridge. ASTERISK-25600 #close Reported by: Mark Michelson Change-Id: I753ead2fffbfc65427ed4e9244c7066610e546da
This commit is contained in:
@@ -746,6 +746,18 @@ int ast_bridge_suspend(struct ast_bridge *bridge, struct ast_channel *chan);
|
||||
*/
|
||||
int ast_bridge_unsuspend(struct ast_bridge *bridge, struct ast_channel *chan);
|
||||
|
||||
/*!
|
||||
* \brief Sets BRIDGECHANNEL and BRIDGEPVTCALLID for a channel
|
||||
*
|
||||
* \pre chan must be locked before calling
|
||||
*
|
||||
* \param name channel name of the bridged peer
|
||||
* \param pvtid Private CallID of the bridged peer
|
||||
*
|
||||
* \return nothing
|
||||
*/
|
||||
void ast_bridge_vars_set(struct ast_channel *chan, const char *name, const char *pvtid);
|
||||
|
||||
struct ast_unreal_pvt;
|
||||
|
||||
/*!
|
||||
|
@@ -1211,7 +1211,7 @@ static void check_bridge_play_sounds(struct ast_bridge *bridge)
|
||||
}
|
||||
}
|
||||
|
||||
static void update_bridge_vars_set(struct ast_channel *chan, const char *name, const char *pvtid)
|
||||
void ast_bridge_vars_set(struct ast_channel *chan, const char *name, const char *pvtid)
|
||||
{
|
||||
ast_channel_stage_snapshot(chan);
|
||||
pbx_builtin_setvar_helper(chan, "BRIDGEPEER", name);
|
||||
@@ -1251,12 +1251,12 @@ static void set_bridge_peer_vars_2party(struct ast_channel *c0, struct ast_chann
|
||||
ast_channel_unlock(c1);
|
||||
|
||||
ast_channel_lock(c0);
|
||||
update_bridge_vars_set(c0, c1_name, c1_pvtid);
|
||||
ast_bridge_vars_set(c0, c1_name, c1_pvtid);
|
||||
UPDATE_BRIDGE_VARS_GET(c0, c0_name, c0_pvtid);
|
||||
ast_channel_unlock(c0);
|
||||
|
||||
ast_channel_lock(c1);
|
||||
update_bridge_vars_set(c1, c0_name, c0_pvtid);
|
||||
ast_bridge_vars_set(c1, c0_name, c0_pvtid);
|
||||
ast_channel_unlock(c1);
|
||||
}
|
||||
|
||||
@@ -1357,7 +1357,7 @@ static void set_bridge_peer_vars_multiparty(struct ast_bridge *bridge)
|
||||
++idx;
|
||||
|
||||
ast_channel_lock(bridge_channel->chan);
|
||||
update_bridge_vars_set(bridge_channel->chan, buf, NULL);
|
||||
ast_bridge_vars_set(bridge_channel->chan, buf, NULL);
|
||||
ast_channel_unlock(bridge_channel->chan);
|
||||
}
|
||||
}
|
||||
@@ -1379,7 +1379,7 @@ static void set_bridge_peer_vars_holding(struct ast_bridge *bridge)
|
||||
|
||||
AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
|
||||
ast_channel_lock(bridge_channel->chan);
|
||||
update_bridge_vars_set(bridge_channel->chan, NULL, NULL);
|
||||
ast_bridge_vars_set(bridge_channel->chan, NULL, NULL);
|
||||
ast_channel_unlock(bridge_channel->chan);
|
||||
}
|
||||
}
|
||||
|
@@ -289,6 +289,10 @@ void ast_bridge_channel_leave_bridge_nolock(struct ast_bridge_channel *bridge_ch
|
||||
|
||||
channel_set_cause(bridge_channel->chan, cause);
|
||||
|
||||
ast_channel_lock(bridge_channel->chan);
|
||||
ast_bridge_vars_set(bridge_channel->chan, NULL, NULL);
|
||||
ast_channel_unlock(bridge_channel->chan);
|
||||
|
||||
/* Change the state on the bridge channel */
|
||||
bridge_channel->state = new_state;
|
||||
|
||||
|
Reference in New Issue
Block a user