diff options
author | mattf <mattf@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-04-28 17:04:23 +0000 |
---|---|---|
committer | mattf <mattf@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-04-28 17:04:23 +0000 |
commit | a9634bfd20b65a79336711d72fcfc9002ec07607 (patch) | |
tree | 75066a841c1985a958d42ff230693619f3b185c9 /channels/chan_zap.c | |
parent | 5a72997136c4279352c4308d15b30efbec793879 (diff) |
Merged revisions 114776 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
........
r114776 | mattf | 2008-04-28 12:00:38 -0500 (Mon, 28 Apr 2008) | 1 line
Fix deadlock issue in chan_zap with libss7 due to channel variables being set with the channel pvt lock being held. #12512
........
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@114777 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_zap.c')
-rw-r--r-- | channels/chan_zap.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/channels/chan_zap.c b/channels/chan_zap.c index 9762d4fbd..52aabbb10 100644 --- a/channels/chan_zap.c +++ b/channels/chan_zap.c @@ -9154,16 +9154,23 @@ static void ss7_start_call(struct zt_pvt *p, struct zt_ss7 *linkset) 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); /* Clear this after we set it */ @@ -9226,6 +9233,9 @@ static void ss7_start_call(struct zt_pvt *p, struct zt_ss7 *linkset) /* 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) |