Merged revisions 146026 via svnmerge from
authorMark Michelson <mmichelson@digium.com>
Thu, 9 Oct 2008 23:15:33 +0000 (23:15 +0000)
committerMark Michelson <mmichelson@digium.com>
Thu, 9 Oct 2008 23:15:33 +0000 (23:15 +0000)
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/trunk@148112 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/features.c

index 9884441..c5e6d92 100644 (file)
@@ -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);