diff --git a/doc/CHANGES-staging/res_agi.txt b/doc/CHANGES-staging/res_agi.txt
new file mode 100644
index 0000000000..eb6132d614
--- /dev/null
+++ b/doc/CHANGES-staging/res_agi.txt
@@ -0,0 +1,5 @@
+Subject: res_agi
+
+Agi command 'exec' can now be enabled
+to evaluate dialplan functions and variables
+by setting the variable AGIEXECFULL to yes.
\ No newline at end of file
diff --git a/res/res_agi.c b/res/res_agi.c
index af85445482..93279050d8 100644
--- a/res/res_agi.c
+++ b/res/res_agi.c
@@ -296,6 +296,9 @@
options.
Returns whatever the application returns, or
-2 on failure to find application.
+
+ exec does not evaluate dialplan functions and variables unless it is explicitly enabled by setting the AGIEXECFULL variable to yes.
+
[AGI]
@@ -3121,6 +3124,9 @@ static int handle_exec(struct ast_channel *chan, AGI *agi, int argc, const char
{
int res, workaround;
struct ast_app *app_to_exec;
+ const char *agi_exec_full_str;
+ int agi_exec_full;
+ struct ast_str *data_with_var = NULL;
if (argc < 2)
return RESULT_SHOWUSAGE;
@@ -3132,8 +3138,21 @@ static int handle_exec(struct ast_channel *chan, AGI *agi, int argc, const char
if (!(workaround = ast_test_flag(ast_channel_flags(chan), AST_FLAG_DISABLE_WORKAROUNDS))) {
ast_set_flag(ast_channel_flags(chan), AST_FLAG_DISABLE_WORKAROUNDS);
}
+ agi_exec_full_str = pbx_builtin_getvar_helper(chan, "AGIEXECFULL");
+ agi_exec_full = ast_true(agi_exec_full_str);
ast_channel_unlock(chan);
- res = pbx_exec(chan, app_to_exec, argc == 2 ? "" : argv[2]);
+
+ if (agi_exec_full) {
+ if ((data_with_var = ast_str_create(16))) {
+ ast_str_substitute_variables(&data_with_var, 0, chan, argv[2]);
+ res = pbx_exec(chan, app_to_exec, argc == 2 ? "" : ast_str_buffer(data_with_var));
+ ast_free(data_with_var);
+ } else {
+ res = -2;
+ }
+ } else {
+ res = pbx_exec(chan, app_to_exec, argc == 2 ? "" : argv[2]);
+ }
if (!workaround) {
ast_channel_clear_flag(chan, AST_FLAG_DISABLE_WORKAROUNDS);
}