[asterisk-commits] bebuild: tag certified-11.6-cert8 r428441 - in /certified/tags/11.6-cert8: ./...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Nov 20 11:01:07 CST 2014
Author: bebuild
Date: Thu Nov 20 11:01:04 2014
New Revision: 428441
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=428441
Log:
Merge r428300 for AST-2014-014
Modified:
certified/tags/11.6-cert8/ (props changed)
certified/tags/11.6-cert8/ChangeLog
certified/tags/11.6-cert8/main/bridging.c
Propchange: certified/tags/11.6-cert8/
------------------------------------------------------------------------------
Binary property 'branch-11-merged' - no diff available.
Propchange: certified/tags/11.6-cert8/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Nov 20 11:01:04 2014
@@ -1,3 +1,3 @@
/branches/11:399513,401167,401179,401182,415825
/certified/branches/1.8.15:382389
-/certified/branches/11.6:423426,426053,428397,428432
+/certified/branches/11.6:423426,426053,428300,428397,428432
Modified: certified/tags/11.6-cert8/ChangeLog
URL: http://svnview.digium.com/svn/asterisk/certified/tags/11.6-cert8/ChangeLog?view=diff&rev=428441&r1=428440&r2=428441
==============================================================================
--- certified/tags/11.6-cert8/ChangeLog (original)
+++ certified/tags/11.6-cert8/ChangeLog Thu Nov 20 11:01:04 2014
@@ -10,6 +10,22 @@
ASTERISK-24469 #close
Reported by Matt Jordan
+
+ * AST-2014-014: Fix race condition where channels may get stuck in
+ ConfBridge under load.
+
+ Under load it was possible for the bridging API, and thus ConfBridge,
+ to get channels that may have hung up stuck in it. This is because
+ handling of state transitions for a bridged channel within a bridge
+ was not protected and simply set the new state without regard to the
+ existing state. If the existing state had been hung up this would get
+ overwritten.
+
+ This change adds locking to protect changing of the state and also
+ takes into consideration the existing state.
+
+ ASTERISK-24440 #close
+ Reported by: Ben Klang
* AST-2014-018 - func_db: DB Dialplan function permission escalation
via AMI.
Modified: certified/tags/11.6-cert8/main/bridging.c
URL: http://svnview.digium.com/svn/asterisk/certified/tags/11.6-cert8/main/bridging.c?view=diff&rev=428441&r1=428440&r2=428441
==============================================================================
--- certified/tags/11.6-cert8/main/bridging.c (original)
+++ certified/tags/11.6-cert8/main/bridging.c Thu Nov 20 11:01:04 2014
@@ -120,8 +120,22 @@
void ast_bridge_change_state(struct ast_bridge_channel *bridge_channel, enum ast_bridge_channel_state new_state)
{
- /* Change the state on the bridge channel */
- bridge_channel->state = new_state;
+ /* Change the state on the bridge channel with some manner of intelligence. */
+ ao2_lock(bridge_channel);
+ switch (bridge_channel->state) {
+ case AST_BRIDGE_CHANNEL_STATE_DEPART:
+ break;
+ case AST_BRIDGE_CHANNEL_STATE_END:
+ case AST_BRIDGE_CHANNEL_STATE_HANGUP:
+ if (new_state != AST_BRIDGE_CHANNEL_STATE_DEPART) {
+ break;
+ }
+ /* Fall through */
+ default:
+ bridge_channel->state = new_state;
+ break;
+ }
+ ao2_unlock(bridge_channel);
/* Only poke the channel's thread if it is not us */
if (!pthread_equal(pthread_self(), bridge_channel->thread)) {
@@ -130,8 +144,6 @@
ast_cond_signal(&bridge_channel->cond);
ao2_unlock(bridge_channel);
}
-
- return;
}
/*! \brief Helper function to poke the bridge thread */
@@ -1147,8 +1159,12 @@
state = bridge_channel_join(bridge_channel);
/* If no other thread is going to take the channel then hang it up, or else we would have to service it until something else came along */
- if (bridge_channel->allow_impart_hangup && (state == AST_BRIDGE_CHANNEL_STATE_END || state == AST_BRIDGE_CHANNEL_STATE_HANGUP)) {
+ if (bridge_channel->allow_impart_hangup
+ && state != AST_BRIDGE_CHANNEL_STATE_DEPART) {
ast_hangup(bridge_channel->chan);
+
+ /* nobody is waiting to join me. */
+ pthread_detach(pthread_self());
}
/* cleanup */
More information about the asterisk-commits
mailing list