-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/3108/
-----------------------------------------------------------
Review request for Asterisk Developers.
Bugs: AST-1258
https://issues.asterisk.org/jira/browse/AST-1258
Repository: Asterisk
Description
-------
Say we have three users who are joining a ConfBridge: two wait marked (WM)
users and a marked (M) user. Say the WM users join the conference and wait for
awhile being entertained. The M user then joins, and the ConfBridge starts.
Internally, this is represented by state transitions that also keep track of
the number of active and waiting users. In this case, the ConfBridge state goes
through the following:
1. WM1 joins EMPTY -> INACTIVE (active: 0; waiting: 1)
2. WM2 joins INACTIVE (active: 0; waiting: 2)
3. M1 joins INACTIVE -> MULTI_MARKED (active: 3; waiting: 0)
Now say someone - perhaps an overzealous sys admin - jumps onto Asterisk and
starts booting users left and right. They even have a script! They issue the
CLI kick user command so fast that we immediately kick M1 first, followed by
WM1 and WM2. Ideally, this would do the following:
4. M1 leaves MULTI_MARKED -> INACTIVE (active: 0; waiting: 2)
5. WM2 leaves INACTIVE (waiting: 1)
6. WM1 leaves INACTIVE (waiting: 0)
When we transition states, the ConfBridge *must* be locked. This prevents the
user counts from getting jumbled and the state transitions from being
perturbed. However, MULTI_MARKED has a race condition: in order to play a
prompt to the bridge notifying the WM users that the leader has left the
conference, it unlocks the conference. This allows the WM user(s) to leave
prior to the M1 user from completely leaving/transitioning the conference. More
often than not, this causes a crash as ConfBridge enters into some very invalid
states.
This patch fixes this by doing the following:
(1) It prevents a user from getting kicked more than once. This isn't strictly
necessary, but is a good idea - we already keep track of whether or not a user
has been kicked, and kicking them multiple times is risky.
(2) It removes the race condition by deferring the "leader has left" playback
until after the conference state has transitioned. If someone sneaks in and
leaves at that time; no harm, no foul.
Diffs
-----
/branches/11/apps/confbridge/conf_state_multi_marked.c 404856
/branches/11/apps/app_confbridge.c 404856
Diff: https://reviewboard.asterisk.org/r/3108/diff/
Testing
-------
An automated test was written that reproduced the scenario. Without the patch:
Explosions. With the patch: Asterisk allowed the users to be kicked without
terminating itself.
Note that the tests will be posted under a separate review.
Thanks,
Matt Jordan
--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --
asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
http://lists.digium.com/mailman/listinfo/asterisk-dev