diff --git a/channel.c b/channel.c index cbedf3fecf592fdcf026a62944fadc71c9c6ea54..c5afa428d48693e33ec7e06a82a1e38885be38bf 100644 --- 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; } diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index 73f1e17a72678c88c160eb21ec12f66b922d8d51..770f8ce145a40e75cd1db3af02a43a929d103418 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -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)