diff --git a/include/asterisk/pbx.h b/include/asterisk/pbx.h index c307254fa3..9fff731048 100644 --- a/include/asterisk/pbx.h +++ b/include/asterisk/pbx.h @@ -1152,6 +1152,8 @@ int ast_context_unlockmacro(const char *macrocontext); * \brief Set the channel to next execute the specified dialplan location. * \see ast_async_parseable_goto, ast_async_goto_if_exists * + * \note If the AST_SOFTHANGUP_ASYNCGOTO flag is set, + * it can prevent the dialplan location from being overwritten by ast_explicit_goto. * \note Do _NOT_ hold any channel locks when calling this function. */ int ast_async_goto(struct ast_channel *chan, const char *context, const char *exten, int priority); @@ -1533,6 +1535,7 @@ int ast_async_parseable_goto(struct ast_channel *chan, const char *goto_string); /*! * \note This function will handle locking the channel as needed. + * \note If the AST_SOFTHANGUP_ASYNCGOTO flag is set on the channel, this function will fail and return -1. */ int ast_explicit_goto(struct ast_channel *chan, const char *context, const char *exten, int priority); diff --git a/main/pbx.c b/main/pbx.c index 4d9ad17c17..b797000bdb 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -7009,6 +7009,10 @@ int ast_explicit_goto(struct ast_channel *chan, const char *context, const char ast_channel_lock(chan); + if (ast_channel_softhangup_internal_flag(chan) & AST_SOFTHANGUP_ASYNCGOTO) { + ast_channel_unlock(chan); + return -1; + } if (!ast_strlen_zero(context)) ast_channel_context_set(chan, context); if (!ast_strlen_zero(exten))