]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Make sure that we don't accept an answer on an inbound call and don't permit asterisk...
authorMark Spencer <markster@digium.com>
Tue, 9 May 2006 15:01:10 +0000 (15:01 +0000)
committerMark Spencer <markster@digium.com>
Tue, 9 May 2006 15:01:10 +0000 (15:01 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@26103 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channel.c
include/asterisk/channel.h

index cbedf3fecf592fdcf026a62944fadc71c9c6ea54..c5afa428d48693e33ec7e06a82a1e38885be38bf 100644 (file)
--- a/channel.c
+++ b/channel.c
@@ -1485,6 +1485,9 @@ int ast_answer(struct ast_channel *chan)
 {
        int res = 0;
        ast_channel_lock(chan);
+       /* You can't answer an outbound call */
+       if (ast_test_flag(chan, AST_FLAG_OUTGOING))
+               return 0;
        /* Stop if we're a zombie or need a soft hangup */
        if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
                ast_channel_unlock(chan);
@@ -1953,13 +1956,17 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
                switch (f->frametype) {
                case AST_FRAME_CONTROL:
                        if (f->subclass == AST_CONTROL_ANSWER) {
-                               if (prestate == AST_STATE_UP) {
+                               if (!ast_test_flag(chan, AST_FLAG_OUTGOING)) {
+                                       ast_log(LOG_DEBUG, "Ignoring answer on an inbound call!\n");
+                                       f = &ast_null_frame;
+                               } else if (prestate == AST_STATE_UP) {
                                        ast_log(LOG_DEBUG, "Dropping duplicate answer!\n");
                                        f = &ast_null_frame;
+                               } else {
+                                       /* Answer the CDR */
+                                       ast_setstate(chan, AST_STATE_UP);
+                                       ast_cdr_answer(chan->cdr);
                                }
-                               /* Answer the CDR */
-                               ast_setstate(chan, AST_STATE_UP);
-                               ast_cdr_answer(chan->cdr);
                        }
                        break;
                case AST_FRAME_DTMF:
@@ -2638,9 +2645,11 @@ int ast_call(struct ast_channel *chan, char *addr, int timeout)
        int res = -1;
        /* Stop if we're a zombie or need a soft hangup */
        ast_channel_lock(chan);
-       if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan))
+       if (!ast_test_flag(chan, AST_FLAG_ZOMBIE) && !ast_check_hangup(chan)) {
                if (chan->tech->call)
                        res = chan->tech->call(chan, addr, timeout);
+               ast_set_flag(chan, AST_FLAG_OUTGOING);
+       }
        ast_channel_unlock(chan);
        return res;
 }
index 73f1e17a72678c88c160eb21ec12f66b922d8d51..770f8ce145a40e75cd1db3af02a43a929d103418 100644 (file)
@@ -466,6 +466,7 @@ struct ast_channel {
                                                   so when ->priority is set, it will get incremented before
                                                   finding the next priority to run
                                                */
+#define AST_FLAG_OUTGOING (1 << 10) /*! Is this call outgoing */
 /* @} */
 
 #define AST_FEATURE_PLAY_WARNING       (1 << 0)