[asterisk-commits] mattf: trunk r114776 - /trunk/channels/chan_zap.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Apr 28 12:00:40 CDT 2008
Author: mattf
Date: Mon Apr 28 12:00:38 2008
New Revision: 114776
URL: http://svn.digium.com/view/asterisk?view=rev&rev=114776
Log:
Fix deadlock issue in chan_zap with libss7 due to channel variables being set with the channel pvt lock being held. #12512
Modified:
trunk/channels/chan_zap.c
Modified: trunk/channels/chan_zap.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_zap.c?view=diff&rev=114776&r1=114775&r2=114776
==============================================================================
--- trunk/channels/chan_zap.c (original)
+++ trunk/channels/chan_zap.c Mon Apr 28 12:00:38 2008
@@ -9161,15 +9161,22 @@
ast_mutex_unlock(&linkset->lock);
c = zt_new(p, AST_STATE_RING, 1, SUB_REAL, law, 0);
- ast_mutex_lock(&linkset->lock);
if (!c) {
ast_log(LOG_WARNING, "Unable to start PBX on CIC %d\n", p->cic);
+ /* Holding this lock is assumed entering the function */
+ ast_mutex_lock(&linkset->lock);
return;
} else
ast_verb(3, "Accepting call to '%s' on CIC %d\n", p->exten, p->cic);
zt_enable_ec(p);
+
+ /* We only reference these variables in the context of the ss7_linkset function
+ * when receiving either and IAM or a COT message. Since they are only accessed
+ * from this context, we should be safe to unlock around them */
+
+ ast_mutex_unlock(&p->lock);
if (!ast_strlen_zero(p->charge_number)) {
pbx_builtin_setvar_helper(c, "SS7_CHARGE_NUMBER", p->charge_number);
@@ -9233,6 +9240,9 @@
/* Clear this after we set it */
p->generic_name[0] = 0;
}
+
+ ast_mutex_lock(&p->lock);
+ ast_mutex_lock(&linkset->lock);
}
static void ss7_apply_plan_to_number(char *buf, size_t size, const struct zt_ss7 *ss7, const char *number, const unsigned nai)
More information about the asterisk-commits
mailing list