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