]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Eliminate deadlock potential in dahdi_fixup().
authorJeff Peeler <jpeeler@digium.com>
Fri, 18 Jun 2010 18:33:17 +0000 (18:33 +0000)
committerJeff Peeler <jpeeler@digium.com>
Fri, 18 Jun 2010 18:33:17 +0000 (18:33 +0000)
(This is a backport of 269307, committed to trunk by rmudgett.)

Calling dahdi_indicate() when the channel private lock is already
held can cause a deadlock if the PRI lock is needed because
dahdi_indicate() will also get the channel private lock.  The pri_grab()
function assumes that the channel private lock is held once to avoid
deadlock.

(closes issue #17261)
Reported by: aragon

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@271335 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_dahdi.c

index d54c951dfd2d89070981edfac176ae1c9f708510..9cd089a93df12a14f791a77a516a4a7021a3fa66 100644 (file)
@@ -3938,10 +3938,10 @@ static int dahdi_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
                                dahdi_unlink(NULL, p, 0);
                        p->subs[x].owner = newchan;
                }
-       if (newchan->_state == AST_STATE_RINGING) 
-               dahdi_indicate(newchan, AST_CONTROL_RINGING, NULL, 0);
        update_conf(p);
        ast_mutex_unlock(&p->lock);
+       if (newchan->_state == AST_STATE_RINGING) 
+               dahdi_indicate(newchan, AST_CONTROL_RINGING, NULL, 0);
        return 0;
 }