From: Kevin P. Fleming Date: Tue, 7 Oct 2008 22:59:08 +0000 (+0000) Subject: don't start a PBX on incoming PRI call channels until after we're done setting channe... X-Git-Tag: 1.4.23-rc1~53 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=198b01597b745a8887d63c97b99342c98d5007e1;p=thirdparty%2Fasterisk.git don't start a PBX on incoming PRI call channels until after we're done setting channel variables and other things on the channel, otherwise the channel might go away (if the dialplan hangs up quickly) before we are done, which results in a spectacular crash git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@147429 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 476a24c628..53a690d62a 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -9080,10 +9080,16 @@ static void *pri_dchannel(void *vpri) } pthread_attr_destroy(&attr); } else { - ast_mutex_unlock(&pri->lock); /* Release PRI lock while we create the channel */ - c = dahdi_new(pri->pvts[chanpos], AST_STATE_RING, 1, SUB_REAL, law, e->ring.ctype); - if (c) { + ast_mutex_unlock(&pri->lock); + + if (!(c = dahdi_new(pri->pvts[chanpos], AST_STATE_RING, 0, SUB_REAL, law, e->ring.ctype))) { + ast_mutex_lock(&pri->lock); + ast_log(LOG_WARNING, "Unable to create channel for %d/%d, span %d\n", + pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span); + pri_hangup(pri->pri, e->ring.call, PRI_CAUSE_SWITCH_CONGESTION); + pri->pvts[chanpos]->call = NULL; + } else { char calledtonstr[10]; ast_mutex_unlock(&pri->pvts[chanpos]->lock); @@ -9110,17 +9116,17 @@ static void *pri_dchannel(void *vpri) if (option_verbose > 2) ast_verbose(VERBOSE_PREFIX_3 "Accepting call from '%s' to '%s' on channel %d/%d, span %d\n", - plancallingnum, pri->pvts[chanpos]->exten, - pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span); - dahdi_enable_ec(pri->pvts[chanpos]); - } else { - - ast_mutex_lock(&pri->lock); - - ast_log(LOG_WARNING, "Unable to start PBX on channel %d/%d, span %d\n", - pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span); - pri_hangup(pri->pri, e->ring.call, PRI_CAUSE_SWITCH_CONGESTION); - pri->pvts[chanpos]->call = NULL; + plancallingnum, pri->pvts[chanpos]->exten, + pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span); + if (ast_pbx_start(c)) { + ast_log(LOG_WARNING, "Unable to start PBX on %s\n", c->name); + ast_hangup(c); + pri->pvts[chanpos]->owner = NULL; + pri_hangup(pri->pri, e->ring.call, PRI_CAUSE_SWITCH_CONGESTION); + pri->pvts[chanpos]->call = NULL; + } else { + dahdi_enable_ec(pri->pvts[chanpos]); + } } } } else {