aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbweschke <bweschke@f38db490-d61c-443f-a65b-d21fe96a405b>2006-05-21 15:16:59 +0000
committerbweschke <bweschke@f38db490-d61c-443f-a65b-d21fe96a405b>2006-05-21 15:16:59 +0000
commitb701e656fd2b06a4f54e74f62485b42ba5d6e7de (patch)
tree1849c68f2573ba0a18d8ded18b0571d5d87a7ac4
parent1a43795f60755de8d0c24a1cf9df5ceb83a214a7 (diff)
When an application that is executed via applicationmap and exits non-zero, make sure that we pass through the correct return value from the application to make sure a segfault doesn't occur by a bridge trying to continue when it should not. Also, when executing applications via applicationmap, make sure that the application is executed against the channel whose DTMF caused it to be fired off in the first place. (part 1/2 of #7090 - this is the only fix that will be applied to both 1.2 and /trunk) acunningham and blitzrage on testing...
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@29196 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--res/res_features.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/res/res_features.c b/res/res_features.c
index f83cadecc..eaae5816d 100644
--- a/res/res_features.c
+++ b/res/res_features.c
@@ -944,8 +944,12 @@ static int feature_exec_app(struct ast_channel *chan, struct ast_channel *peer,
if (ast_test_flag(feature, AST_FEATURE_FLAG_CALLEE))
work = peer;
res = pbx_exec(work, app, feature->app_args, 1);
- if (res < 0)
- return res;
+ if (res == AST_PBX_KEEPALIVE)
+ return FEATURE_RETURN_PBX_KEEPALIVE;
+ else if (res == AST_PBX_NO_HANGUP_PEER)
+ return FEATURE_RETURN_NO_HANGUP_PEER;
+ else if (res)
+ return FEATURE_RETURN_SUCCESSBREAK;
} else {
ast_log(LOG_WARNING, "Could not find application (%s)\n", feature->app);
return -2;
@@ -1021,7 +1025,10 @@ static int ast_feature_interpret(struct ast_channel *chan, struct ast_channel *p
if (!strcmp(feature->exten, code)) {
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 " Feature Found: %s exten: %s\n",feature->sname, tok);
- res = feature->operation(chan, peer, config, code, sense);
+ if (sense == FEATURE_SENSE_CHAN)
+ res = feature->operation(chan, peer, config, code, sense);
+ else
+ res = feature->operation(peer, chan, config, code, sense);
break;
} else if (!strncmp(feature->exten, code, strlen(code))) {
res = FEATURE_RETURN_STOREDIGITS;