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 $$$;
+
+