bridge_basic.c: Make sure that ast_bridge_channel is not destroyed while iterating over bridge->channels.

From the gdb information, we can see that while iterating over bridge->channels, the ast_bridge_channel reference count is 0, indicating it has already been destroyed.Additionally, when ast_bridge_channel is removed from bridge->channels, the bridge is first locked. Therefore, locking the bridge before iterating over bridge->channels can resolve the race condition.

Resolves: https://github.com/asterisk/asterisk/issues/768
pull/594/head^2
Tinet-mucw 11 months ago committed by asterisk-org-access-app[bot]
parent 07aa0ffe6a
commit 7d28165cb1

@ -1851,7 +1851,9 @@ static void bridge_ringing(struct ast_bridge *bridge)
.subclass.integer = AST_CONTROL_RINGING, .subclass.integer = AST_CONTROL_RINGING,
}; };
ast_bridge_lock(bridge);
ast_bridge_queue_everyone_else(bridge, NULL, &ringing); ast_bridge_queue_everyone_else(bridge, NULL, &ringing);
ast_bridge_unlock(bridge);
} }
/*! /*!
@ -1864,7 +1866,9 @@ static void bridge_hold(struct ast_bridge *bridge)
.subclass.integer = AST_CONTROL_HOLD, .subclass.integer = AST_CONTROL_HOLD,
}; };
ast_bridge_lock(bridge);
ast_bridge_queue_everyone_else(bridge, NULL, &hold); ast_bridge_queue_everyone_else(bridge, NULL, &hold);
ast_bridge_unlock(bridge);
} }
/*! /*!
@ -1877,7 +1881,9 @@ static void bridge_unhold(struct ast_bridge *bridge)
.subclass.integer = AST_CONTROL_UNHOLD, .subclass.integer = AST_CONTROL_UNHOLD,
}; };
ast_bridge_lock(bridge);
ast_bridge_queue_everyone_else(bridge, NULL, &unhold); ast_bridge_queue_everyone_else(bridge, NULL, &unhold);
ast_bridge_unlock(bridge);
} }
/*! /*!

Loading…
Cancel
Save