From 8c6a39286ed54e2b4f73848a9f8918a740eab39f Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Sun, 6 Oct 2019 20:42:54 +0200
Subject: [PATCH] lib-sieve: index extension: Do not accept :index tag with
 zero value.

---
 src/lib-sieve/plugins/index/tag-index.c    | 14 +++++++++++++-
 tests/extensions/index/errors.svtest       |  2 +-
 tests/extensions/index/errors/syntax.sieve |  6 ++++++
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/lib-sieve/plugins/index/tag-index.c b/src/lib-sieve/plugins/index/tag-index.c
index ba29e79c1..d8938a50a 100644
--- a/src/lib-sieve/plugins/index/tag-index.c
+++ b/src/lib-sieve/plugins/index/tag-index.c
@@ -122,6 +122,13 @@ tag_index_validate(struct sieve_validator *valdtr ATTR_UNUSED,
 	}
 
 	data->fieldno = sieve_ast_argument_number(*arg);
+	if (data->fieldno == 0) {
+		sieve_argument_validate_error(valdtr, *arg,
+			"the :index tag for the %s %s cannot be zero",
+			sieve_command_identifier(cmd),
+			sieve_command_type_name(cmd));
+		return FALSE;
+	}
 
 	/* Detach parameter */
 	*arg = sieve_ast_arguments_detach(*arg,1);
@@ -204,7 +211,8 @@ svmo_index_dump_context(const struct sieve_message_override *svmo ATTR_UNUSED,
 	sieve_number_t fieldno = 0;
 	unsigned int last;
 
-	if (!sieve_binary_read_integer(denv->sblock, address, &fieldno))
+	if (!sieve_binary_read_integer(denv->sblock, address, &fieldno) ||
+	    fieldno == 0)
 		return FALSE;
 
 	sieve_code_dumpf(denv, "fieldno: %llu", (unsigned long long) fieldno);
@@ -231,6 +239,10 @@ svmo_index_read_context(const struct sieve_message_override *svmo ATTR_UNUSED,
 		sieve_runtime_trace_error(renv, "fieldno: invalid number");
 		return SIEVE_EXEC_BIN_CORRUPT;
 	}
+	if (fieldno == 0) {
+		sieve_runtime_trace_error(renv, "fieldno: index is zero");
+		return SIEVE_EXEC_BIN_CORRUPT;
+	}
 	if (!sieve_binary_read_byte(renv->sblock, address, &last)) {
 		sieve_runtime_trace_error(renv, "last: invalid byte");
 		return SIEVE_EXEC_BIN_CORRUPT;
diff --git a/tests/extensions/index/errors.svtest b/tests/extensions/index/errors.svtest
index b975fd4f6..4bfe2dc5f 100644
--- a/tests/extensions/index/errors.svtest
+++ b/tests/extensions/index/errors.svtest
@@ -12,7 +12,7 @@ test "Invalid Syntax" {
                 test_fail "compile should have failed";
         }
 
-        if not test_error :count "eq" :comparator "i;ascii-numeric" "5" {
+        if not test_error :count "eq" :comparator "i;ascii-numeric" "7" {
                 test_fail "wrong number of errors reported";
         }
 }
diff --git a/tests/extensions/index/errors/syntax.sieve b/tests/extensions/index/errors/syntax.sieve
index afa31e3cb..ee19d8819 100644
--- a/tests/extensions/index/errors/syntax.sieve
+++ b/tests/extensions/index/errors/syntax.sieve
@@ -18,3 +18,9 @@ if header :index "frop" "to" "ok" {}
 
 # 4: last without index
 if header :last "to" "ok" {}
+
+# 5: index 0
+if header :index 0 "to" "ok" {}
+
+# 6: index 0 last
+if header :index 0 :last "to" "ok" {}
-- 
GitLab