From 6e979c2563f4a2a418545126c746522e8b6309ed Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Sat, 9 Aug 2008 20:31:22 +0200 Subject: [PATCH] Limited number of command arguments. --- src/lib-sieve/sieve-limits.h | 1 + src/lib-sieve/sieve-parser.c | 10 +++++++++- tests/compile/errors.svtest | 14 ++++++++++++++ tests/compile/errors/parser.sieve | 15 +++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 tests/compile/errors/parser.sieve diff --git a/src/lib-sieve/sieve-limits.h b/src/lib-sieve/sieve-limits.h index d7fcc7c8f..d3426ca4f 100644 --- a/src/lib-sieve/sieve-limits.h +++ b/src/lib-sieve/sieve-limits.h @@ -12,6 +12,7 @@ * AST */ +#define SIEVE_MAX_COMMAND_ARGUMENTS 32 #define SIEVE_MAX_BLOCK_NESTING 32 #define SIEVE_MAX_TEST_NESTING 32 diff --git a/src/lib-sieve/sieve-parser.c b/src/lib-sieve/sieve-parser.c index 84306fa73..83612b91a 100644 --- a/src/lib-sieve/sieve-parser.c +++ b/src/lib-sieve/sieve-parser.c @@ -7,6 +7,8 @@ #include "istream.h" #include "failures.h" +#include "sieve-common.h" +#include "sieve-limits.h" #include "sieve-script.h" #include "sieve-lexer.h" #include "sieve-parser.h" @@ -272,9 +274,15 @@ static int sieve_parse_arguments "failed to accept more arguments for command '%s'", node->identifier); return -1; } + + if ( sieve_ast_argument_count(node) > SIEVE_MAX_COMMAND_ARGUMENTS ) { + sieve_parser_error(parser, + "too many arguments for command '%s'", node->identifier); + return FALSE; + } } - if ( !result ) return FALSE; /* Defer recovery to caller */ + if ( result <= 0 ) return result; /* Defer recovery to caller */ /* --> [ test / test-list ] * test-list = "(" test *("," test) ")" diff --git a/tests/compile/errors.svtest b/tests/compile/errors.svtest index 32c837534..7681a13d1 100644 --- a/tests/compile/errors.svtest +++ b/tests/compile/errors.svtest @@ -22,6 +22,20 @@ test "Lexer errors (FIXME: count only)" { } } +/* + * Parser errors + */ + +test "Parser errors (FIXME: count only)" { + if test_compile "errors/parser.sieve" { + test_fail "compile should have failed."; + } + + if not test_error :count "eq" :comparator "i;ascii-numeric" "4" { + test_fail "wrong number of errors reported"; + } +} + /* * Header test */ diff --git a/tests/compile/errors/parser.sieve b/tests/compile/errors/parser.sieve new file mode 100644 index 000000000..916940ab2 --- /dev/null +++ b/tests/compile/errors/parser.sieve @@ -0,0 +1,15 @@ +/* + * Parser errors + */ + +# Too many arguments +frop :this "is" "a" 2 :long "argument" "list" :and :it :should "fail" :during "parsing" :but "it" "should" "be" + "recoverable" "." :this "is" "a" 2 :long "argument" "list" :and :it :should "fail" :during "parsing" :but + "it" "should" "be" "recoverable" { + stop; +} + +# Garbage argument +friep $$$; + + -- GitLab