From 49ea79173355bee7353696bc364be0615b6b752e Mon Sep 17 00:00:00 2001 From: Mark Michelson Date: Thu, 9 Oct 2008 23:20:08 +0000 Subject: [PATCH] Merged revisions 148112 via svnmerge from https://origsvn.digium.com/svn/asterisk/trunk ................ r148112 | mmichelson | 2008-10-09 18:15:33 -0500 (Thu, 09 Oct 2008) | 26 lines Merged revisions 146026 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r146026 | murf | 2008-10-03 12:12:54 -0500 (Fri, 03 Oct 2008) | 18 lines (closes issue #13579) Reported by: dwagner (closes issue #13584) Reported by: dwagner Tested by: murf, putnopvut The thought occurred to me that the res= from the extension spawn was ending up being returned from the bridge. "Thou shalt not poison the return value". Made the change and it appears to allow blind xfers to work as normal. If I'm wrong, reopen the bugs. But it looks good to me! Many thanks to putnopvut for helping me reproduce this! ........ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@148115 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/features.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/main/features.c b/main/features.c index 4025c7b542..6de1783834 100644 --- a/main/features.c +++ b/main/features.c @@ -2387,6 +2387,7 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast char save_exten[AST_MAX_EXTENSION]; int save_prio; int found = 0; /* set if we find at least one match */ + int spawn_error = 0; if (ast_opt_end_cdr_before_h_exten) { ast_cdr_end(bridge_cdr); @@ -2403,15 +2404,13 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast ast_copy_string(chan->exten, "h", sizeof(chan->exten)); chan->priority = 1; ast_channel_unlock(chan); - while ((res = ast_spawn_extension(chan, chan->context, chan->exten, chan->priority, chan->cid.cid_num, &found, 1)) == 0) { + while ((spawn_error = ast_spawn_extension(chan, chan->context, chan->exten, chan->priority, chan->cid.cid_num, &found, 1)) == 0) { chan->priority++; } - if (found && res) { + if (found && spawn_error) { /* Something bad happened, or a hangup has been requested. */ ast_debug(1, "Spawn extension (%s,%s,%d) exited non-zero on '%s'\n", chan->context, chan->exten, chan->priority, chan->name); ast_verb(2, "Spawn extension (%s, %s, %d) exited non-zero on '%s'\n", chan->context, chan->exten, chan->priority, chan->name); - } else if (!found && res) { - res = 0; } /* swap it back */ ast_channel_lock(chan);