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