Skip to content
Snippets Groups Projects
Commit d418e991 authored by Mark Michelson's avatar Mark Michelson
Browse files

Prevent potential race condition in multiparty basic bridges.

For more details about the race condition see the linked review
at the bottom of this commit

(closes issue ASTERISK-21882)
Reported by Matt Jordan

Review: https://reviewboard.asterisk.org/r/2663



git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@394232 65c4cc65-6c06-0410-ace0-fbb531ad65f3
parent b700dc66
No related branches found
No related tags found
No related merge requests found
...@@ -99,9 +99,16 @@ struct ast_flags *ast_bridge_features_ds_get(struct ast_channel *chan) ...@@ -99,9 +99,16 @@ struct ast_flags *ast_bridge_features_ds_get(struct ast_channel *chan)
*/ */
static int basic_hangup_hook(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, void *hook_pvt) static int basic_hangup_hook(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, void *hook_pvt)
{ {
/* BUGBUG Race condition. If all parties but one hangup at the same time, the bridge may not be dissolved on the remaining party. */ int bridge_count = 0;
struct ast_bridge_channel *iter;
ast_bridge_channel_lock_bridge(bridge_channel); ast_bridge_channel_lock_bridge(bridge_channel);
if (2 < bridge_channel->bridge->num_channels) { AST_LIST_TRAVERSE(&bridge->channels, iter, entry) {
if (iter != bridge_channel && iter->state == AST_BRIDGE_CHANNEL_STATE_WAIT) {
++bridge_count;
}
}
if (2 <= bridge_count) {
/* Just allow this channel to leave the multi-party bridge. */ /* Just allow this channel to leave the multi-party bridge. */
ast_bridge_change_state(bridge_channel, AST_BRIDGE_CHANNEL_STATE_HANGUP); ast_bridge_change_state(bridge_channel, AST_BRIDGE_CHANNEL_STATE_HANGUP);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment