From 6a490856d9967ac309907d8c3228b0a74ec61bc4 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Sun, 6 Jan 2008 01:26:12 +0100
Subject: [PATCH] Fixed bugs in validation error handling and fixed bugs in
 dynamic argument support.

---
 src/lib-sieve/cmd-redirect.c                         |  5 ++---
 src/lib-sieve/ext-envelope.c                         | 12 +++++++-----
 src/lib-sieve/ext-fileinto.c                         |  3 +--
 src/lib-sieve/ext-reject.c                           |  3 +--
 src/lib-sieve/plugins/body/tst-body.c                | 12 +++++++-----
 .../plugins/imapflags/ext-imapflags-common.c         |  7 +++----
 src/lib-sieve/plugins/imapflags/tst-hasflag.c        | 10 +++++-----
 src/lib-sieve/plugins/vacation/ext-vacation.c        |  3 +--
 src/lib-sieve/plugins/variables/cmd-set.c            |  4 ++--
 .../plugins/variables/ext-variables-common.c         |  6 +++---
 src/lib-sieve/plugins/variables/tst-string.c         | 12 +++++++-----
 src/lib-sieve/plugins/variables/variables.sieve      |  8 +++++++-
 src/lib-sieve/sieve-validator.c                      | 12 ++++++++----
 src/lib-sieve/tst-address.c                          | 12 +++++++-----
 src/lib-sieve/tst-exists.c                           |  5 +----
 src/lib-sieve/tst-header.c                           | 12 +++++++-----
 src/lib-sieve/tst-size.c                             |  3 +--
 17 files changed, 70 insertions(+), 59 deletions(-)

diff --git a/src/lib-sieve/cmd-redirect.c b/src/lib-sieve/cmd-redirect.c
index f39882db9..a7cd3352b 100644
--- a/src/lib-sieve/cmd-redirect.c
+++ b/src/lib-sieve/cmd-redirect.c
@@ -98,9 +98,8 @@ static bool cmd_redirect_validate
 		(validator, cmd, arg, "address", 1, SAAT_STRING) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, cmd, arg, FALSE);
-	 
-	return TRUE;
+	
+	return sieve_validator_argument_activate(validator, cmd, arg, FALSE);
 }
 
 /*
diff --git a/src/lib-sieve/ext-envelope.c b/src/lib-sieve/ext-envelope.c
index 67a187791..4b307936d 100644
--- a/src/lib-sieve/ext-envelope.c
+++ b/src/lib-sieve/ext-envelope.c
@@ -115,7 +115,9 @@ static bool tst_envelope_validate(struct sieve_validator *validator, struct siev
 		(validator, tst, arg, "envelope part", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+	
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 	
 	arg = sieve_ast_argument_next(arg);
 	
@@ -123,12 +125,12 @@ static bool tst_envelope_validate(struct sieve_validator *validator, struct siev
 		(validator, tst, arg, "key list", 2, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+	
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 
 	/* Validate the key argument to a specified match type */
-	sieve_match_type_validate(validator, tst, arg);
-	
-	return TRUE;
+	return sieve_match_type_validate(validator, tst, arg);
 }
 
 /* Load extension into validator */
diff --git a/src/lib-sieve/ext-fileinto.c b/src/lib-sieve/ext-fileinto.c
index 056e1bed0..3f0478563 100644
--- a/src/lib-sieve/ext-fileinto.c
+++ b/src/lib-sieve/ext-fileinto.c
@@ -93,9 +93,8 @@ static bool cmd_fileinto_validate(struct sieve_validator *validator, struct siev
 		(validator, cmd, arg, "folder", 1, SAAT_STRING) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, cmd, arg, FALSE);
 	
-	return TRUE;
+	return sieve_validator_argument_activate(validator, cmd, arg, FALSE);
 }
 
 /* Load extension into validator */
diff --git a/src/lib-sieve/ext-reject.c b/src/lib-sieve/ext-reject.c
index 53a9aa66d..87d29086f 100644
--- a/src/lib-sieve/ext-reject.c
+++ b/src/lib-sieve/ext-reject.c
@@ -131,9 +131,8 @@ static bool cmd_reject_validate(struct sieve_validator *validator, struct sieve_
 		(validator, cmd, arg, "reason", 1, SAAT_STRING) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, cmd, arg, FALSE);
 	
-	return TRUE;
+	return sieve_validator_argument_activate(validator, cmd, arg, FALSE);
 }
 
 /* Load extension into validator */
diff --git a/src/lib-sieve/plugins/body/tst-body.c b/src/lib-sieve/plugins/body/tst-body.c
index b82500476..b6f3409b7 100644
--- a/src/lib-sieve/plugins/body/tst-body.c
+++ b/src/lib-sieve/plugins/body/tst-body.c
@@ -140,7 +140,9 @@ static bool tag_body_transform_validate
 			(validator, cmd, tag, *arg, SAAT_STRING_LIST) ) {
 			return FALSE;
 		}
-		sieve_validator_argument_activate(validator, cmd, *arg, FALSE);
+		
+		if ( !sieve_validator_argument_activate(validator, cmd, *arg, FALSE) )
+			return FALSE;
 		
 		/* Assign tag parameters */
 		tag->parameters = *arg;
@@ -192,12 +194,12 @@ static bool tst_body_validate
 		(validator, tst, arg, "key list", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 
 	/* Validate the key argument to a specified match type */
-	sieve_match_type_validate(validator, tst, arg);
-	
-	return TRUE;
+	return sieve_match_type_validate(validator, tst, arg);
 }
 
 /*
diff --git a/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c b/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
index 6160db49d..10335f2ad 100644
--- a/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
+++ b/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
@@ -36,7 +36,8 @@ bool ext_imapflags_command_validate
 
 	arg2 = sieve_ast_argument_next(arg);
 	if ( arg2 != NULL ) {		
-		sieve_validator_argument_activate(validator, cmd, arg, TRUE);
+		if ( !sieve_validator_argument_activate(validator, cmd, arg, TRUE) )
+			return FALSE;
 
 		/* First, check syntax sanity */
 				
@@ -73,9 +74,7 @@ bool ext_imapflags_command_validate
 	} else
 		arg2 = arg;
 
-	sieve_validator_argument_activate(validator, cmd, arg2, FALSE);	
-
-	return TRUE;
+	return sieve_validator_argument_activate(validator, cmd, arg2, FALSE);	
 }
 
 bool ext_imapflags_command_operation_dump
diff --git a/src/lib-sieve/plugins/imapflags/tst-hasflag.c b/src/lib-sieve/plugins/imapflags/tst-hasflag.c
index abee74538..2df3d6b3b 100644
--- a/src/lib-sieve/plugins/imapflags/tst-hasflag.c
+++ b/src/lib-sieve/plugins/imapflags/tst-hasflag.c
@@ -106,7 +106,8 @@ static bool tst_hasflag_validate
 	
 	arg2 = sieve_ast_argument_next(arg);
 	if ( arg2 != NULL ) {
-		sieve_validator_argument_activate(validator, tst, arg, TRUE);
+		if ( !sieve_validator_argument_activate(validator, tst, arg, TRUE) )
+			return FALSE;
 
 		/* First, check syntax sanity */
 		
@@ -133,13 +134,12 @@ static bool tst_hasflag_validate
 	} else 
 		arg2 = arg;
 
-	sieve_validator_argument_activate(validator, tst, arg2, FALSE);
+	if ( !sieve_validator_argument_activate(validator, tst, arg2, FALSE) )
+		return FALSE;
 	
 	/* Validate the key argument to a specified match type */
 	
-	sieve_match_type_validate(validator, tst, arg2);
-	
-	return TRUE;
+	return sieve_match_type_validate(validator, tst, arg2);
 }
 
 /*
diff --git a/src/lib-sieve/plugins/vacation/ext-vacation.c b/src/lib-sieve/plugins/vacation/ext-vacation.c
index 0bf1f355d..c54c82c00 100644
--- a/src/lib-sieve/plugins/vacation/ext-vacation.c
+++ b/src/lib-sieve/plugins/vacation/ext-vacation.c
@@ -287,9 +287,8 @@ static bool cmd_vacation_validate(struct sieve_validator *validator,
 		(validator, cmd, arg, "reason", 1, SAAT_STRING) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, cmd, arg, FALSE);	
 	
-	return TRUE;
+	return sieve_validator_argument_activate(validator, cmd, arg, FALSE);	
 }
 
 /* Load extension into validator */
diff --git a/src/lib-sieve/plugins/variables/cmd-set.c b/src/lib-sieve/plugins/variables/cmd-set.c
index 2d911f85a..f3ae9e567 100644
--- a/src/lib-sieve/plugins/variables/cmd-set.c
+++ b/src/lib-sieve/plugins/variables/cmd-set.c
@@ -155,6 +155,7 @@ static bool cmd_set_validate(struct sieve_validator *validator,
 		(validator, cmd, arg, "name", 1, SAAT_STRING) ) {
 		return FALSE;
 	}
+	
 	ext_variables_variable_argument_activate(validator, arg);
 
 	arg = sieve_ast_argument_next(arg);
@@ -163,9 +164,8 @@ static bool cmd_set_validate(struct sieve_validator *validator,
 		(validator, cmd, arg, "value", 2, SAAT_STRING) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, cmd, arg, FALSE);	
 	
-	return TRUE;
+	return sieve_validator_argument_activate(validator, cmd, arg, FALSE);	
 }
 
 /*
diff --git a/src/lib-sieve/plugins/variables/ext-variables-common.c b/src/lib-sieve/plugins/variables/ext-variables-common.c
index 9fc481226..ba39f72a4 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-common.c
+++ b/src/lib-sieve/plugins/variables/ext-variables-common.c
@@ -428,10 +428,10 @@ static bool arg_variable_string_validate
 			(validator, cmd, *arg, TRUE);
 	}
 	
-	if ( substart > strstart ) {
+	if ( strend > strstart ) {
 		struct sieve_ast_argument *strarg = _add_string_element(arglist, *arg);
-		strarg->_value.str = str_new(pool, substart - strstart);
-		str_append_n(strarg->_value.str, strstart, substart - strstart); 
+		strarg->_value.str = str_new(pool, strend - strstart);
+		str_append_n(strarg->_value.str, strstart, strend - strstart); 
 		
 		if ( !sieve_validator_argument_activate_super
 			(validator, cmd, strarg, FALSE) )
diff --git a/src/lib-sieve/plugins/variables/tst-string.c b/src/lib-sieve/plugins/variables/tst-string.c
index ece3095a3..27597e17c 100644
--- a/src/lib-sieve/plugins/variables/tst-string.c
+++ b/src/lib-sieve/plugins/variables/tst-string.c
@@ -85,7 +85,9 @@ static bool tst_string_validate
 		(validator, tst, arg, "source", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+	
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 	
 	arg = sieve_ast_argument_next(arg);
 
@@ -93,12 +95,12 @@ static bool tst_string_validate
 		(validator, tst, arg, "key list", 2, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+	
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 
 	/* Validate the key argument to a specified match type */
-	sieve_match_type_validate(validator, tst, arg);
-	
-	return TRUE;
+	return sieve_match_type_validate(validator, tst, arg);
 }
 
 /* Test generation */
diff --git a/src/lib-sieve/plugins/variables/variables.sieve b/src/lib-sieve/plugins/variables/variables.sieve
index 207dbc0ec..450a5e685 100644
--- a/src/lib-sieve/plugins/variables/variables.sieve
+++ b/src/lib-sieve/plugins/variables/variables.sieve
@@ -4,4 +4,10 @@ require "fileinto";
 set :upper "foo" "foosome";
 set :lower "bar" "bareable";
 
-fileinto "${foo}.${bar}";
+#fileinto "${foo}.${bar}";
+
+#set "huts" "${foo} likes the ${bar}";
+#set "fluts" "${foo}";
+set "friep" "it is ${foo} but not ${bar}!";
+
+fileinto "${friep}";
diff --git a/src/lib-sieve/sieve-validator.c b/src/lib-sieve/sieve-validator.c
index 16f0aa79d..80735e93a 100644
--- a/src/lib-sieve/sieve-validator.c
+++ b/src/lib-sieve/sieve-validator.c
@@ -457,7 +457,7 @@ static bool sieve_validator_argument_default_activate
 		
 	validator->current_defarg = prev_defarg;	
 		
-	return TRUE;
+	return result;
 }
 
 bool sieve_validator_argument_activate_super
@@ -470,6 +470,8 @@ bool sieve_validator_argument_activate_super
 		return FALSE;
 	
 	if ( validator->current_defarg->overrides == NULL ) {
+		enum sieve_argument_type prev_type = validator->current_defarg_type;
+		
 		switch ( validator->current_defarg_type ) {
 		case SAT_NUMBER:
 		case SAT_CONST_STRING:
@@ -482,6 +484,8 @@ bool sieve_validator_argument_activate_super
 		default: 
 			return FALSE;
 		}
+		
+		validator->current_defarg_type = prev_type;
 	} else
 		defarg = validator->current_defarg->overrides;
 	
@@ -554,10 +558,10 @@ bool sieve_validate_tag_parameter
 			sieve_ast_argument_type_name(req_type),	sieve_ast_argument_name(param));
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, cmd, param, FALSE);
+
 	param->arg_id_code = tag->arg_id_code;
-	
-	return TRUE;
+
+	return sieve_validator_argument_activate(validator, cmd, param, FALSE);
 }
 
 /* Test validation API */
diff --git a/src/lib-sieve/tst-address.c b/src/lib-sieve/tst-address.c
index fadb70477..bc835bf29 100644
--- a/src/lib-sieve/tst-address.c
+++ b/src/lib-sieve/tst-address.c
@@ -79,7 +79,9 @@ static bool tst_address_validate
 		(validator, tst, arg, "header list", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+	
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 
 	arg = sieve_ast_argument_next(arg);
 	
@@ -87,12 +89,12 @@ static bool tst_address_validate
 		(validator, tst, arg, "key list", 2, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 	
 	/* Validate the key argument to a specified match type */
-	sieve_match_type_validate(validator, tst, arg);
-
-	return TRUE;
+	return sieve_match_type_validate(validator, tst, arg);
 }
 
 /* Test generation */
diff --git a/src/lib-sieve/tst-exists.c b/src/lib-sieve/tst-exists.c
index a2cc38554..6c44cb6f1 100644
--- a/src/lib-sieve/tst-exists.c
+++ b/src/lib-sieve/tst-exists.c
@@ -58,11 +58,8 @@ static bool tst_exists_validate
 		(validator, tst, arg, "header names", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
 	
-	tst->data = arg;
-	
-	return TRUE;
+	return sieve_validator_argument_activate(validator, tst, arg, FALSE);
 }
 
 /* Test generation */
diff --git a/src/lib-sieve/tst-header.c b/src/lib-sieve/tst-header.c
index 020cc914f..d3191f448 100644
--- a/src/lib-sieve/tst-header.c
+++ b/src/lib-sieve/tst-header.c
@@ -83,7 +83,9 @@ static bool tst_header_validate
 		(validator, tst, arg, "header names", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+	
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 	
 	arg = sieve_ast_argument_next(arg);
 
@@ -91,12 +93,12 @@ static bool tst_header_validate
 		(validator, tst, arg, "key list", 2, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+	
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 
 	/* Validate the key argument to a specified match type */
-	sieve_match_type_validate(validator, tst, arg);
-	
-	return TRUE;
+	return sieve_match_type_validate(validator, tst, arg);
 }
 
 /* Test generation */
diff --git a/src/lib-sieve/tst-size.c b/src/lib-sieve/tst-size.c
index 8efb6a852..9a916d28b 100644
--- a/src/lib-sieve/tst-size.c
+++ b/src/lib-sieve/tst-size.c
@@ -155,9 +155,8 @@ static bool tst_size_validate
 		(validator, tst, arg, "limit", 1, SAAT_NUMBER) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
 	
-	return TRUE;
+	return sieve_validator_argument_activate(validator, tst, arg, FALSE);
 }
 
 /* Test generation */
-- 
GitLab