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