diff --git a/src/lib-sieve/sieve-limits.h b/src/lib-sieve/sieve-limits.h index d7fcc7c8f7b486ff29d987de33c715d4e5d61361..d3426ca4f260a7f70ed2e712c6cddc610cc6d6e6 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 84306fa737ee53d07874e6a126d9dcce717099a0..83612b91a5f4d930403485fe70c355437f73be55 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 32c83753407f757b3e52c6b63472c8c02f441d6c..7681a13d18b6a4dbc01a423442756308a646cd62 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 0000000000000000000000000000000000000000..916940ab283c364fb6bb323b972ac22763d24903 --- /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 $$$; + +