From: Tinet-mucw Date: Tue, 22 Jul 2025 09:36:11 +0000 (-0700) Subject: pbx.c: When the AST_SOFTHANGUP_ASYNCGOTO flag is set, pbx_extension_helper should... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=009e3ef3f5fae65700515739d8f9d8ff522eed37;p=thirdparty%2Fasterisk.git pbx.c: When the AST_SOFTHANGUP_ASYNCGOTO flag is set, pbx_extension_helper should return directly. Under certain circumstances the context/extens/prio are set in the ast_async_goto, for example action Redirect. In the situation that action Redirect is broken by pbx_extension_helper this info is changed. This will cause the current dialplan location to be executed twice. In other words, the Redirect action does not take effect. Resolves: #1315 --- diff --git a/main/pbx.c b/main/pbx.c index 65b9ce7f07..ae7e66bc9c 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -2942,11 +2942,17 @@ static int pbx_extension_helper(struct ast_channel *c, struct ast_context *con, ast_log(LOG_WARNING, "No application '%s' for extension (%s, %s, %d)\n", e->app, context, exten, priority); return -1; } + ast_channel_lock(c); + if (ast_channel_softhangup_internal_flag(c) & AST_SOFTHANGUP_ASYNCGOTO) { + ast_channel_unlock(c); + return 0; + } if (ast_channel_context(c) != context) ast_channel_context_set(c, context); if (ast_channel_exten(c) != exten) ast_channel_exten_set(c, exten); ast_channel_priority_set(c, priority); + ast_channel_unlock(c); if (substitute) { pbx_substitute_variables_helper(c, substitute, passdata, sizeof(passdata)-1); }