diff options
author | Richard Mudgett <rmudgett@digium.com> | 2011-01-14 21:13:08 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2011-01-14 21:13:08 +0000 |
commit | c69406f384f41f849af0f1d4fcae3c4458fcdffb (patch) | |
tree | 09a86b1f06abcbe6f510d33f82f0263e02c1155d /channels | |
parent | ed0a2e8c314f75d41893ec4150196d9584eca82e (diff) |
Merged revisions 301946 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8
........
r301946 | rmudgett | 2011-01-14 15:09:57 -0600 (Fri, 14 Jan 2011) | 13 lines
Deadlock between dahdi_request() and pri_dchannel() processing an incomming call.
The sig_pri_new_ast_channel() is called with the channel private lock held
when pri_dchannel() calls it and no channel private lock held when
dahdi_request() calls it. The use of pri_grab() in
sig_pri_new_ast_channel() could leave the channel private lock held when
it returns if the lock was not held before calling it.
Make sig_pri_new_ast_channel() just lock the PRI span lock instead of
using pri_grab(). It is safe to do this because dahdi_request() does not
have the channel private lock and the deadlock potential with the PRI span
lock is only between pri_dchannel() and other threads.
........
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@301947 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r-- | channels/sig_pri.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/channels/sig_pri.c b/channels/sig_pri.c index cbfe5b063..a858ef20f 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -880,11 +880,10 @@ static struct ast_channel *sig_pri_new_ast_channel(struct sig_pri_chan *p, int s if (transfercapability & AST_TRANS_CAP_DIGITAL) { sig_pri_set_digital(p, 1); } - if (p->pri && !pri_grab(p, p->pri)) { + if (p->pri) { + ast_mutex_lock(&p->pri->lock); sig_pri_span_devstate_changed(p->pri); - pri_rel(p->pri); - } else { - ast_log(LOG_WARNING, "Failed to grab PRI!\n"); + ast_mutex_unlock(&p->pri->lock); } return c; |