From de1f2da7d565e367eafe7df28527874ee7f068da Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan.bosch@open-xchange.com> Date: Sun, 13 Oct 2019 13:52:59 +0200 Subject: [PATCH] lib-sieve: plugins: special-use: tag-special-use - Fix handling of variable argument. The use of a variable substitution erroneously produced a runtime syntax error. --- .../plugins/special-use/tag-specialuse.c | 18 ++++++++++-------- tests/extensions/special-use/execute.svtest | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/lib-sieve/plugins/special-use/tag-specialuse.c b/src/lib-sieve/plugins/special-use/tag-specialuse.c index d480764b0..83473c715 100644 --- a/src/lib-sieve/plugins/special-use/tag-specialuse.c +++ b/src/lib-sieve/plugins/special-use/tag-specialuse.c @@ -100,7 +100,6 @@ tag_specialuse_validate(struct sieve_validator *valdtr, struct sieve_command *cmd) { struct sieve_ast_argument *tag = *arg; - const char *use_flag; /* Detach the tag itself */ *arg = sieve_ast_argument_next(*arg); @@ -111,13 +110,16 @@ tag_specialuse_validate(struct sieve_validator *valdtr, if (!sieve_validate_tag_parameter(valdtr, cmd, tag, *arg, NULL, 0, SAAT_STRING, FALSE)) return FALSE; - use_flag = sieve_ast_argument_strc(*arg); - if (!ext_special_use_flag_valid(use_flag)) { - sieve_argument_validate_error( - valdtr, *arg, "specialuse tag: " - "invalid special-use flag `%s' specified", - str_sanitize(use_flag, 64)); - return FALSE; + if (sieve_argument_is_string_literal(*arg)) { + const char *use_flag = sieve_ast_argument_strc(*arg); + + if (!ext_special_use_flag_valid(use_flag)) { + sieve_argument_validate_error( + valdtr, *arg, "specialuse tag: " + "invalid special-use flag `%s' specified", + str_sanitize(use_flag, 64)); + return FALSE; + } } tag->parameters = *arg; diff --git a/tests/extensions/special-use/execute.svtest b/tests/extensions/special-use/execute.svtest index 746f1d3e6..a2b637e38 100644 --- a/tests/extensions/special-use/execute.svtest +++ b/tests/extensions/special-use/execute.svtest @@ -1,6 +1,7 @@ require "vnd.dovecot.testsuite"; require "special-use"; require "fileinto"; +require "variables"; test "Specialuse_exists - None exist" { if specialuse_exists "\\Sent" { @@ -33,3 +34,21 @@ Frop! test_fail "execution of result failed"; } } + +test ":specialuse variable" { + test_set "message" text: +From: stephan@example.org +To: nico@frop.example.org +Subject: Frop 1 + +Frop! +. + ; + + set "use" "\\Junk"; + fileinto :specialuse "${use}" "frop"; + + if not test_result_execute { + test_fail "execution of result failed"; + } +} -- GitLab