From fb9c630eed9899d7d8ab1f1c3a4b6e01bbf652dd Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan.bosch@open-xchange.com> Date: Fri, 11 Sep 2020 00:19:47 +0200 Subject: [PATCH] lib-sieve: plugins: imap4flags: test-hasflag - Fix segfault occurring for command without arguments. --- Makefile.am | 1 + .../plugins/imap4flags/tst-hasflag.c | 5 +- tests/extensions/imap4flags/errors.svtest | 18 ++++++++ .../extensions/imap4flags/errors/syntax.sieve | 46 +++++++++++++++++++ 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 tests/extensions/imap4flags/errors.svtest create mode 100644 tests/extensions/imap4flags/errors/syntax.sieve diff --git a/Makefile.am b/Makefile.am index 180e80e73..8ca026764 100644 --- a/Makefile.am +++ b/Makefile.am @@ -102,6 +102,7 @@ test_cases = \ tests/extensions/include/rfc.svtest \ tests/extensions/include/execute.svtest \ tests/extensions/imap4flags/basic.svtest \ + tests/extensions/imap4flags/errors.svtest \ tests/extensions/imap4flags/hasflag.svtest \ tests/extensions/imap4flags/execute.svtest \ tests/extensions/imap4flags/multiscript.svtest \ diff --git a/src/lib-sieve/plugins/imap4flags/tst-hasflag.c b/src/lib-sieve/plugins/imap4flags/tst-hasflag.c index 691c27b1a..9ee2c5f6e 100644 --- a/src/lib-sieve/plugins/imap4flags/tst-hasflag.c +++ b/src/lib-sieve/plugins/imap4flags/tst-hasflag.c @@ -99,8 +99,6 @@ static bool tst_hasflag_validate(struct sieve_validator *valdtr, struct sieve_command *tst) { - struct sieve_ast_argument *vars = tst->first_positional; - struct sieve_ast_argument *keys = sieve_ast_argument_next(vars); const struct sieve_match_type mcht_default = SIEVE_MATCH_TYPE_DEFAULT(is_match_type); const struct sieve_comparator cmp_default = @@ -109,6 +107,9 @@ tst_hasflag_validate(struct sieve_validator *valdtr, if (!ext_imap4flags_command_validate(valdtr, tst)) return FALSE; + struct sieve_ast_argument *vars = tst->first_positional; + struct sieve_ast_argument *keys = sieve_ast_argument_next(vars); + if (keys == NULL) { keys = vars; vars = NULL; diff --git a/tests/extensions/imap4flags/errors.svtest b/tests/extensions/imap4flags/errors.svtest new file mode 100644 index 000000000..2f873ab04 --- /dev/null +++ b/tests/extensions/imap4flags/errors.svtest @@ -0,0 +1,18 @@ +require "vnd.dovecot.testsuite"; + +require "relational"; +require "comparator-i;ascii-numeric"; + +/* + * Invalid syntax + */ + +test "Invalid Syntax" { + if test_script_compile "errors/syntax.sieve" { + test_fail "compile should have failed"; + } + + if not test_error :count "eq" :comparator "i;ascii-numeric" "31" { + test_fail "wrong number of errors reported"; + } +} diff --git a/tests/extensions/imap4flags/errors/syntax.sieve b/tests/extensions/imap4flags/errors/syntax.sieve new file mode 100644 index 000000000..b619943c5 --- /dev/null +++ b/tests/extensions/imap4flags/errors/syntax.sieve @@ -0,0 +1,46 @@ +require "imap4flags"; + +# 1-10: Used incorrectly as a command vs test +if setflag {} +if addflag {} +if removeflag {} +if setflag; +if addflag; +if removeflag; +hasflag; + +# 11-19: Used with no argument +setflag; +addflag; +removeflag; +if hasflag {} +if hasflag; +if not hasflag {} +if not hasflag; + +# Used with one string argument (OK) +setflag "frop"; +addflag "frop"; +removeflag "frop"; +if hasflag "frop" {} + +# 20-25: Used with one number argument +setflag 234234; +addflag 23423; +removeflag 234234; +if hasflag 234234 {} +if hasflag 234234; + +# Used with one string list argument (OK) +setflag ["frop"]; +addflag ["frop"]; +removeflag ["frop"]; +if hasflag ["frop"] {} + +# 26-30: Used with unknown tag +setflag :frop "frop"; +addflag :frop "frop"; +removeflag :frop "frop"; +if hasflag :frop "frop" {} +if hasflag :frop "frop"; + -- GitLab