diff --git a/src/lib-sieve/cmd-redirect.c b/src/lib-sieve/cmd-redirect.c index f39882db9011f431218e546a6d32828b8c2d26eb..a7cd3352b79c469feb28497358707d102be7dcb0 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 67a187791c60ab40b4ed62c5d2a1e9e0c440fb49..4b307936d8dc67f907718a9c3a31af8dffa98850 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 056e1bed0c47449a50d7a15740796fd9b31fcb96..3f04785635cdda497caa1eee00b70ec367971a5b 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 53a9aa66dcd7fbbc94ccc97cfb53e21bb726d31c..87d29086f76623a55e2256cc6b86fc996ae86768 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 b825004765b2b3aac6f77ec9dbf2cdb2b38dd5a5..b6f3409b7af60f1abf67ade4b66492c6e5942e65 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 6160db49d41bcd515e5e2599490da2a8f4ab149e..10335f2ad6b54a2025b8df18f65b0f6536b265e7 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 abee7453893df5e2e6af94a65d808a87cc5cfbe2..2df3d6b3b26832bd8a3035bb569b80b51c9326e5 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 0bf1f355d930415c8b626374cf3dc542c592cb27..c54c82c009385d5628701d9b3a714ec1e47c4f4b 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 2d911f85a28cfcb84a71a73cd9200fdc9caf476a..f3ae9e56713e13780072b9aeb106bd732f0393dd 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 9fc481226558887b6d0db6b4fd060aac0bf5e720..ba39f72a49fb7e152d9b41116312f9527ac69273 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 ece3095a31a9666233c0bc17c890b8f6ebd45976..27597e17ce9b94a94d35eab5586336e5641e08a9 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 207dbc0ec80f1f4aed2816eb95287d790ac9c3a6..450a5e685ac8750b6df805299d947f0bccef7494 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 16f0aa79d5492a8d4ca4311ec3f75d9a6c9afb37..80735e93ae236374fe0b5c2cf5e07bd484c2e5de 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 fadb704776933c935c79ef9bacbd8f05b43f5440..bc835bf29ed9a95dde9c35a30a1b92136104a3b4 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 a2cc385549f2084d36bf91662ff5a5735a1927dd..6c44cb6f127d70d7fc4f4c6fb2bb5ddd4c7dd02c 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 020cc914f7379d8a610b1e2bfaebd72da1dcad80..d3191f448c42cd3940e5d8e634041538c3dd90e3 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 8efb6a852c9e2838d7d18aa09d7c6aaa84822b4e..9a916d28bdd465bacf77ba3c3ed25640f5efc388 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 */