aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorrmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b>2011-01-14 21:09:57 +0000
committerrmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b>2011-01-14 21:09:57 +0000
commit722929451b0eb0af0f57282ecb47171ae49be12f (patch)
tree714ddca5df8f59d694917b9186daa766c91d06e3 /channels
parent2cf287b2e65059dd3b303fee717c8b7dfa64a93a (diff)
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: http://svn.digium.com/svn/asterisk/branches/1.8@301946 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/sig_pri.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/channels/sig_pri.c b/channels/sig_pri.c
index f6c6b0796..255f0ff35 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;