]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 231095 via svnmerge from
authorJeff Peeler <jpeeler@digium.com>
Tue, 24 Nov 2009 18:54:01 +0000 (18:54 +0000)
committerJeff Peeler <jpeeler@digium.com>
Tue, 24 Nov 2009 18:54:01 +0000 (18:54 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

........
  r231095 | jpeeler | 2009-11-24 12:50:36 -0600 (Tue, 24 Nov 2009) | 11 lines

  Fix erroneous hangup extension execution

  ast_spawn_extension behaves differently from 1.4 in that hangups and extensions
  that do not exist do not return an error, whereas in 1.6 it does. This is now
  taken into account so that the AST_FLAG_BRIDGE_HANGUP_RUN flag gets set
  properly.

  (closes issue #16106)
  Reported by: ajohnson
  Tested by: ajohnson
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@231097 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/features.c

index a170514d4d7fd3bdfaac3471d60e2de0a29134e8..4eaf87ccd1e046188e1f6c87286ec8efe9059522 100644 (file)
@@ -2769,6 +2769,10 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
                while ((spawn_error = ast_spawn_extension(chan, chan->context, chan->exten, chan->priority, chan->cid.cid_num, &found, 1)) == 0) {
                        chan->priority++;
                }
+               if (spawn_error && (!ast_exists_extension(chan, chan->context, chan->exten, chan->priority, chan->cid.cid_num) || ast_check_hangup(chan))) {
+                       /* if the extension doesn't exist or a hangup occurred, this isn't really a spawn error */
+                       spawn_error = 0;
+               }
                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);
@@ -2785,7 +2789,7 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
                                bridge_cdr = NULL;
                        }
                }
-               if (chan->priority != 1 || !spawn_error) {
+               if (!spawn_error) {
                        ast_set_flag(chan, AST_FLAG_BRIDGE_HANGUP_RUN);
                }
                ast_channel_unlock(chan);