aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2008-10-07 22:59:08 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2008-10-07 22:59:08 +0000
commit1cf9f97998c9344a67264841c9646878be7759fc (patch)
tree5a4f8361a97d402eb972ffdc829b07a7ef42547b /channels
parentf46844399c55063212431abfca305c11eb61362d (diff)
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: http://svn.digium.com/svn/asterisk/branches/1.4@147429 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_dahdi.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index 476a24c62..53a690d62 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 {