dovecot-2.0-pigeonhole: Improved runtime error handing.
pigeonhole at rename-it.nl
pigeonhole at rename-it.nl
Sat Aug 14 01:29:34 EEST 2010
details: http://hg.rename-it.nl/dovecot-2.0-pigeonhole/rev/b889191ef74c
changeset: 1371:b889191ef74c
user: Stephan Bosch <stephan at rename-it.nl>
date: Sat Aug 14 00:06:22 2010 +0200
description:
Improved runtime error handing.
- Changed operand read functions to prove exec status return codes in stead of boolean.
- Restructured optional-operand, stringlist and string-match APIs to provide execution status (error code) upon failure.
- Corruption errors are only produced when the binary is actually corrupt. Normal failures should never cause a recompile attempt anymore.
- Simplified optional-operand API.
- Cleaned up test command implementations that use the string-match API.
diffstat:
TODO | 1 -
src/lib-sieve/cmd-discard.c | 7 +-
src/lib-sieve/cmd-keep.c | 9 +-
src/lib-sieve/cmd-redirect.c | 17 +-
src/lib-sieve/ext-envelope.c | 35 +-
src/lib-sieve/ext-fileinto.c | 15 +-
src/lib-sieve/ext-reject.c | 15 +-
src/lib-sieve/plugins/body/tst-body.c | 58 +-
src/lib-sieve/plugins/date/ext-date-common.c | 1 +
src/lib-sieve/plugins/date/tst-date.c | 66 +-
src/lib-sieve/plugins/enotify/cmd-notify.c | 44 +-
src/lib-sieve/plugins/enotify/tst-notify-method-capability.c | 54 +-
src/lib-sieve/plugins/enotify/tst-valid-notify-method.c | 6 +-
src/lib-sieve/plugins/environment/tst-environment.c | 47 +-
src/lib-sieve/plugins/imap4flags/cmd-flag.c | 51 +-
src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c | 2 +
src/lib-sieve/plugins/imap4flags/tag-flags.c | 38 +-
src/lib-sieve/plugins/imap4flags/tst-hasflag.c | 50 +-
src/lib-sieve/plugins/mailbox/tst-mailboxexists.c | 7 +-
src/lib-sieve/plugins/notify/cmd-denotify.c | 55 +-
src/lib-sieve/plugins/notify/cmd-notify.c | 30 +-
src/lib-sieve/plugins/regex/mcht-regex.c | 29 +-
src/lib-sieve/plugins/relational/mcht-count.c | 19 +-
src/lib-sieve/plugins/spamvirustest/tst-spamvirustest.c | 34 +-
src/lib-sieve/plugins/vacation/cmd-vacation.c | 41 +-
src/lib-sieve/plugins/variables/cmd-set.c | 16 +-
src/lib-sieve/plugins/variables/ext-variables-namespaces.c | 65 +-
src/lib-sieve/plugins/variables/ext-variables-operands.c | 167 ++++---
src/lib-sieve/plugins/variables/sieve-ext-variables.h | 24 +-
src/lib-sieve/plugins/variables/tst-string.c | 43 +-
src/lib-sieve/sieve-actions.c | 37 +-
src/lib-sieve/sieve-actions.h | 5 +-
src/lib-sieve/sieve-address-parts.c | 35 +-
src/lib-sieve/sieve-address-parts.h | 22 +-
src/lib-sieve/sieve-address.c | 1 +
src/lib-sieve/sieve-code.c | 339 +++++++++-------
src/lib-sieve/sieve-code.h | 72 +-
src/lib-sieve/sieve-comparators.h | 19 +-
src/lib-sieve/sieve-match-types.h | 20 +-
src/lib-sieve/sieve-match.c | 114 +++-
src/lib-sieve/sieve-match.h | 12 +-
src/lib-sieve/sieve-message.c | 1 +
src/lib-sieve/sieve-objects.c | 4 +-
src/lib-sieve/sieve-runtime-trace.c | 6 +-
src/lib-sieve/sieve-runtime-trace.h | 8 +-
src/lib-sieve/sieve-stringlist.c | 5 +-
src/lib-sieve/sieve-stringlist.h | 6 +-
src/lib-sieve/tst-address.c | 34 +-
src/lib-sieve/tst-exists.c | 8 +-
src/lib-sieve/tst-header.c | 45 +-
src/lib-sieve/tst-size.c | 5 +-
src/managesieve/cmd-putscript.c | 2 +-
src/sieve-tools/debug/cmd-debug-print.c | 8 +-
src/testsuite/cmd-test-binary.c | 6 +-
src/testsuite/cmd-test-config.c | 20 +-
src/testsuite/cmd-test-fail.c | 5 +-
src/testsuite/cmd-test-mailbox.c | 5 +-
src/testsuite/cmd-test-message.c | 14 +-
src/testsuite/cmd-test-set.c | 5 +-
src/testsuite/cmd-test.c | 6 +-
src/testsuite/testsuite-log.c | 1 +
src/testsuite/testsuite-objects.c | 6 +-
src/testsuite/testsuite-result.c | 1 +
src/testsuite/testsuite-substitutions.c | 42 +-
src/testsuite/tst-test-error.c | 39 +-
src/testsuite/tst-test-multiscript.c | 6 +-
src/testsuite/tst-test-result.c | 39 +-
src/testsuite/tst-test-script-compile.c | 6 +-
src/testsuite/tst-test-script-run.c | 12 +-
69 files changed, 1088 insertions(+), 979 deletions(-)
diffs (truncated from 4653 to 300 lines):
diff -r 7dc1741fe305 -r b889191ef74c TODO
--- a/TODO Thu Aug 12 16:28:02 2010 +0200
+++ b/TODO Sat Aug 14 00:06:22 2010 +0200
@@ -1,7 +1,6 @@
Current activities:
* Improve error handling and logging
- - Improve runtime error handling
- Avoid reporting user-caused errors to the master log.
- Review logging and error handling; add more warning/info/debug messages
where useful.
diff -r 7dc1741fe305 -r b889191ef74c src/lib-sieve/cmd-discard.c
--- a/src/lib-sieve/cmd-discard.c Thu Aug 12 16:28:02 2010 +0200
+++ b/src/lib-sieve/cmd-discard.c Sat Aug 14 00:06:22 2010 +0200
@@ -113,8 +113,11 @@
sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS,
"discard action; cancel implicit keep");
- return ( sieve_result_add_action
- (renv, NULL, &act_discard, NULL, source_line, NULL, 0) >= 0 );
+ if ( sieve_result_add_action
+ (renv, NULL, &act_discard, NULL, source_line, NULL, 0) < 0 )
+ return SIEVE_EXEC_FAILURE;
+
+ return SIEVE_EXEC_OK;
}
/*
diff -r 7dc1741fe305 -r b889191ef74c src/lib-sieve/cmd-keep.c
--- a/src/lib-sieve/cmd-keep.c Thu Aug 12 16:28:02 2010 +0200
+++ b/src/lib-sieve/cmd-keep.c Sat Aug 14 00:06:22 2010 +0200
@@ -95,8 +95,8 @@
source_line = sieve_runtime_get_command_location(renv);
/* Optional operands (side effects only) */
- if ( (ret=sieve_action_opr_optional_read(renv, address, NULL, &slist)) != 0 )
- return SIEVE_EXEC_BIN_CORRUPT;
+ if ( sieve_action_opr_optional_read(renv, address, NULL, &ret, &slist) != 0 )
+ return ret;
/*
* Perform operation
@@ -107,9 +107,10 @@
/* Add keep action to result.
*/
- ret = sieve_result_add_keep(renv, slist, source_line);
+ if ( sieve_result_add_keep(renv, slist, source_line) < 0 )
+ return SIEVE_EXEC_FAILURE;
- return ( ret >= 0 );
+ return SIEVE_EXEC_OK;
}
diff -r 7dc1741fe305 -r b889191ef74c src/lib-sieve/cmd-redirect.c
--- a/src/lib-sieve/cmd-redirect.c Thu Aug 12 16:28:02 2010 +0200
+++ b/src/lib-sieve/cmd-redirect.c Sat Aug 14 00:06:22 2010 +0200
@@ -195,7 +195,7 @@
string_t *redirect;
unsigned int source_line;
pool_t pool;
- int ret = 0;
+ int ret;
/*
* Read data
@@ -205,12 +205,12 @@
source_line = sieve_runtime_get_command_location(renv);
/* Optional operands (side effects only) */
- if ( (ret=sieve_action_opr_optional_read(renv, address, NULL, &slist)) < 0 )
- return SIEVE_EXEC_BIN_CORRUPT;
+ if ( sieve_action_opr_optional_read(renv, address, NULL, &ret, &slist) != 0 )
+ return ret;
/* Read the address */
- if ( !sieve_opr_string_read(renv, address, "address", &redirect) )
- return SIEVE_EXEC_BIN_CORRUPT;
+ if ( (ret=sieve_opr_string_read(renv, address, "address", &redirect)) <= 0 )
+ return ret;
/*
* Perform operation
@@ -232,11 +232,12 @@
act = p_new(pool, struct act_redirect_context, 1);
act->to_address = p_strdup(pool, str_c(redirect));
- ret = sieve_result_add_action
+ if ( sieve_result_add_action
(renv, NULL, &act_redirect, slist, source_line, (void *) act,
- svinst->max_redirects);
+ svinst->max_redirects) < 0 )
+ return SIEVE_EXEC_FAILURE;
- return ( ret >= 0 );
+ return SIEVE_EXEC_OK;
}
/*
diff -r 7dc1741fe305 -r b889191ef74c src/lib-sieve/ext-envelope.c
--- a/src/lib-sieve/ext-envelope.c Thu Aug 12 16:28:02 2010 +0200
+++ b/src/lib-sieve/ext-envelope.c Sat Aug 14 00:06:22 2010 +0200
@@ -299,6 +299,7 @@
addrlist = t_new(struct sieve_envelope_address_list, 1);
addrlist->addrlist.strlist.runenv = renv;
+ addrlist->addrlist.strlist.exec_status = SIEVE_EXEC_OK;
addrlist->addrlist.strlist.next_item =
sieve_envelope_address_list_next_string_item;
addrlist->addrlist.strlist.reset = sieve_envelope_address_list_reset;
@@ -582,26 +583,26 @@
SIEVE_ADDRESS_PART_DEFAULT(all_address_part);
struct sieve_stringlist *env_part_list, *value_list, *key_list;
struct sieve_address_list *addr_list;
- int ret;
+ int match, ret;
/*
* Read operands
*/
/* Read optional operands */
- if ( (ret=sieve_addrmatch_opr_optional_read
- (renv, address, NULL, &addrp, &mcht, &cmp)) < 0 )
- return SIEVE_EXEC_BIN_CORRUPT;
+ if ( sieve_addrmatch_opr_optional_read
+ (renv, address, NULL, &ret, &addrp, &mcht, &cmp) < 0 )
+ return ret;
/* Read envelope-part */
- if ( (env_part_list=sieve_opr_stringlist_read(renv, address, "envelope-part"))
- == NULL )
- return SIEVE_EXEC_BIN_CORRUPT;
+ if ( (ret=sieve_opr_stringlist_read
+ (renv, address, "envelope-part", &env_part_list)) <= 0 )
+ return ret;
/* Read key-list */
- if ( (key_list=sieve_opr_stringlist_read(renv, address, "key-list"))
- == NULL )
- return SIEVE_EXEC_BIN_CORRUPT;
+ if ( (ret=sieve_opr_stringlist_read(renv, address, "key-list", &key_list))
+ <= 0 )
+ return ret;
/*
* Perform test
@@ -614,15 +615,11 @@
value_list = sieve_address_part_stringlist_create(renv, &addrp, addr_list);
/* Perform match */
- ret = sieve_match(renv, &mcht, &cmp, value_list, key_list);
-
+ if ( (match=sieve_match(renv, &mcht, &cmp, value_list, key_list, &ret)) < 0 )
+ return ret;
+
/* Set test result for subsequent conditional jump */
- if ( ret >= 0 ) {
- sieve_interpreter_set_test_result(renv->interp, ret > 0);
- return SIEVE_EXEC_OK;
- }
-
- sieve_runtime_trace_error(renv, "invalid string-list item");
- return SIEVE_EXEC_BIN_CORRUPT;
+ sieve_interpreter_set_test_result(renv->interp, match > 0);
+ return SIEVE_EXEC_OK;
}
diff -r 7dc1741fe305 -r b889191ef74c src/lib-sieve/ext-fileinto.c
--- a/src/lib-sieve/ext-fileinto.c Thu Aug 12 16:28:02 2010 +0200
+++ b/src/lib-sieve/ext-fileinto.c Sat Aug 14 00:06:22 2010 +0200
@@ -166,12 +166,12 @@
source_line = sieve_runtime_get_command_location(renv);
/* Optional operands (side effects only) */
- if ( (ret=sieve_action_opr_optional_read(renv, address, NULL, &slist)) < 0 )
- return SIEVE_EXEC_BIN_CORRUPT;
+ if ( sieve_action_opr_optional_read(renv, address, NULL, &ret, &slist) != 0 )
+ return ret;
/* Folder operand */
- if ( !sieve_opr_string_read(renv, address, "folder", &folder) )
- return SIEVE_EXEC_BIN_CORRUPT;
+ if ( (ret=sieve_opr_string_read(renv, address, "folder", &folder)) <= 0 )
+ return ret;
/*
* Perform operation
@@ -187,10 +187,11 @@
}
/* Add action to result */
- ret = sieve_act_store_add_to_result
- (renv, slist, str_c(folder), source_line);
+ if ( sieve_act_store_add_to_result
+ (renv, slist, str_c(folder), source_line) < 0 )
+ return SIEVE_EXEC_FAILURE;
- return ( ret >= 0 );
+ return SIEVE_EXEC_OK;
}
diff -r 7dc1741fe305 -r b889191ef74c src/lib-sieve/ext-reject.c
--- a/src/lib-sieve/ext-reject.c Thu Aug 12 16:28:02 2010 +0200
+++ b/src/lib-sieve/ext-reject.c Sat Aug 14 00:06:22 2010 +0200
@@ -279,12 +279,12 @@
source_line = sieve_runtime_get_command_location(renv);
/* Optional operands (side effects only) */
- if ( (ret=sieve_action_opr_optional_read(renv, address, NULL, &slist)) < 0 )
- return SIEVE_EXEC_BIN_CORRUPT;
+ if ( sieve_action_opr_optional_read(renv, address, NULL, &ret, &slist) != 0 )
+ return ret;
/* Read rejection reason */
- if ( !sieve_opr_string_read(renv, address, "reason", &reason) )
- return SIEVE_EXEC_BIN_CORRUPT;
+ if ( (ret=sieve_opr_string_read(renv, address, "reason", &reason)) <= 0 )
+ return ret;
/*
* Perform operation
@@ -307,10 +307,11 @@
act->reason = p_strdup(pool, str_c(reason));
act->ereject = ( sieve_operation_is(oprtn, ereject_operation) );
- ret = sieve_result_add_action
- (renv, this_ext, &act_reject, slist, source_line, (void *) act, 0);
+ if ( sieve_result_add_action
+ (renv, this_ext, &act_reject, slist, source_line, (void *) act, 0) < 0 )
+ return SIEVE_EXEC_FAILURE;
- return ( ret >= 0 );
+ return SIEVE_EXEC_OK;
}
/*
diff -r 7dc1741fe305 -r b889191ef74c src/lib-sieve/plugins/body/tst-body.c
--- a/src/lib-sieve/plugins/body/tst-body.c Thu Aug 12 16:28:02 2010 +0200
+++ b/src/lib-sieve/plugins/body/tst-body.c Sat Aug 14 00:06:22 2010 +0200
@@ -255,13 +255,13 @@
/* Handle any optional arguments */
for (;;) {
- int ret;
+ int opt;
- if ( (ret=sieve_match_opr_optional_dump(denv, address, &opt_code))
+ if ( (opt=sieve_match_opr_optional_dump(denv, address, &opt_code))
< 0 )
return FALSE;
- if ( ret == 0 ) break;
+ if ( opt == 0 ) break;
switch ( opt_code ) {
case OPT_BODY_TRANSFORM:
@@ -302,7 +302,6 @@
static int ext_body_operation_execute
(const struct sieve_runtime_env *renv, sieve_size_t *address)
{
- int ret;
int opt_code = 0;
struct sieve_comparator cmp =
SIEVE_COMPARATOR_DEFAULT(i_ascii_casemap_comparator);
@@ -312,6 +311,7 @@
struct sieve_stringlist *ctype_list, *value_list, *key_list;
bool mvalues_active;
const char * const *content_types = NULL;
+ int match, ret;
/*
* Read operands
@@ -321,46 +321,44 @@
ctype_list = NULL;
for (;;) {
- bool opok = TRUE;
+ int opt;
- if ( (ret=sieve_match_opr_optional_read
- (renv, address, &opt_code, &cmp, &mcht)) < 0 )
- return SIEVE_EXEC_BIN_CORRUPT;
+ if ( (opt=sieve_match_opr_optional_read
+ (renv, address, &opt_code, &ret, &cmp, &mcht)) < 0 )
+ return ret;
- if ( ret == 0 ) break;
+ if ( opt == 0 ) break;
switch ( opt_code ) {
case OPT_BODY_TRANSFORM:
if ( !sieve_binary_read_byte(renv->sblock, address, &transform) ||
transform > TST_BODY_TRANSFORM_TEXT ) {
sieve_runtime_trace_error(renv, "invalid body transform type");
- opok = FALSE;
+ return SIEVE_EXEC_BIN_CORRUPT;
}
More information about the dovecot-cvs
mailing list