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