From: Richard Mudgett Date: Wed, 9 Jun 2010 16:54:38 +0000 (+0000) Subject: Eliminate deadlock potential in dahdi_fixup(). X-Git-Tag: 11.0.0-beta1~2864 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6c6260d4c7cbc38ff872eea390a2fd83d094c270;p=thirdparty%2Fasterisk.git Eliminate deadlock potential in dahdi_fixup(). Calling dahdi_indicate() within dahdi_fixup() while the owner pointers are in a potentially inconsistent state is a potentially bad thing in principle. However, 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. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@269307 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index a71f3abdc1..d054323f53 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -7085,9 +7085,6 @@ 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); - if (analog_lib_handles(p->sig, p->radio, p->oprmode)) { analog_fixup(oldchan, newchan, p->sig_pvt); } @@ -7099,6 +7096,10 @@ static int dahdi_fixup(struct ast_channel *oldchan, struct ast_channel *newchan) update_conf(p); ast_mutex_unlock(&p->lock); + + if (newchan->_state == AST_STATE_RINGING) { + dahdi_indicate(newchan, AST_CONTROL_RINGING, NULL, 0); + } return 0; }