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