dovecot-2.2-pigeonhole: lib-sieve: Moved handling of implicit ke...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Wed Nov 18 21:11:39 UTC 2015


details:   http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/d23225e408af
changeset: 2133:d23225e408af
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Wed Nov 18 22:11:31 2015 +0100
description:
lib-sieve: Moved handling of implicit keep during multiscript execution outside the script sequence itself.
Before, implicit keep was executed as part of the final script execution. This caused the implicit keep to be executed as part of that script, including global context.
This caused insignificant errors during delivery to be logged as errors in the administrator log when the last script is global.

diffstat:

 src/lib-sieve/sieve-result.c             |   8 ++++-
 src/lib-sieve/sieve.c                    |  46 ++++++++++++++++---------------
 src/lib-sieve/sieve.h                    |   6 ++--
 src/plugins/lda-sieve/lda-sieve-plugin.c |   7 ++--
 src/sieve-tools/sieve-test.c             |   4 +-
 src/testsuite/testsuite-script.c         |   3 +-
 6 files changed, 40 insertions(+), 34 deletions(-)

diffs (228 lines):

diff -r f2c5a9f92e0d -r d23225e408af src/lib-sieve/sieve-result.c
--- a/src/lib-sieve/sieve-result.c	Sun Nov 15 22:46:01 2015 +0100
+++ b/src/lib-sieve/sieve-result.c	Wed Nov 18 22:11:31 2015 +0100
@@ -1033,9 +1033,15 @@
 (struct sieve_result *result,
 	struct sieve_error_handler *ehandler)
 {
+	int ret;
+
 	_sieve_result_prepare_execution(result, ehandler);
 
-	return _sieve_result_implicit_keep(result, TRUE);
+	ret = _sieve_result_implicit_keep(result, TRUE);
+
+	result->action_env.ehandler = NULL;
+
+	return ret;
 }
 
 void sieve_result_mark_executed(struct sieve_result *result)
diff -r f2c5a9f92e0d -r d23225e408af src/lib-sieve/sieve.c
--- a/src/lib-sieve/sieve.c	Sun Nov 15 22:46:01 2015 +0100
+++ b/src/lib-sieve/sieve.c	Wed Nov 18 22:11:31 2015 +0100
@@ -664,13 +664,10 @@
 (struct sieve_multiscript *mscript, struct sieve_binary *sbin,
 	struct sieve_error_handler *exec_ehandler,
 	struct sieve_error_handler *action_ehandler,
-	enum sieve_runtime_flags flags, bool final)
+	enum sieve_runtime_flags flags)
 {
 	if ( !mscript->active ) return FALSE;
 
-	if ( final )
-		sieve_result_set_keep_action(mscript->result, NULL, &act_store);
-
 	/* Run the script */
 	mscript->status = sieve_run(sbin, &mscript->result, mscript->msgdata,
 		mscript->scriptenv, exec_ehandler, flags);
@@ -685,7 +682,7 @@
 				(mscript, action_ehandler, &mscript->keep);
 		}
 		mscript->active =
-			( mscript->active && mscript->keep && !final && mscript->status > 0 );
+			( mscript->active && mscript->keep && mscript->status > 0 );
 	}
 
 	if ( mscript->status <= 0 )
@@ -699,16 +696,20 @@
 	return mscript->status;
 }
 
-int sieve_multiscript_tempfail(struct sieve_multiscript **mscript,
+int sieve_multiscript_tempfail(struct sieve_multiscript **_mscript,
 	struct sieve_error_handler *action_ehandler)
 {
-	struct sieve_result *result = (*mscript)->result;
-	int ret = (*mscript)->status;
+	struct sieve_multiscript *mscript = *_mscript;
+	struct sieve_result *result = mscript->result;
+	int ret = mscript->status;
 
-	if ( (*mscript)->active ) {
+	sieve_result_set_keep_action
+		(mscript->result, NULL, &act_store);
+
+	if ( mscript->active ) {
 		ret = SIEVE_EXEC_TEMP_FAILURE;
 
-		if ( !(*mscript)->teststream && sieve_result_executed(result) ) {
+		if ( !mscript->teststream && sieve_result_executed(result) ) {
 			/* Part of the result is already executed, need to fall back to
 			 * to implicit keep (FIXME)
 			 */
@@ -725,27 +726,29 @@
 
 	/* Cleanup */
 	sieve_result_unref(&result);
-	*mscript = NULL;
+	*_mscript = NULL;
 
 	return ret;
 }
 
-int sieve_multiscript_finish(struct sieve_multiscript **mscript,
+int sieve_multiscript_finish(struct sieve_multiscript **_mscript,
 	struct sieve_error_handler *action_ehandler, bool *keep)
 {
-	struct sieve_result *result = (*mscript)->result;
-	int ret = (*mscript)->status;
+	struct sieve_multiscript *mscript = *_mscript;
+	struct sieve_result *result = mscript->result;
+	int ret = mscript->status;
 
-	if ( (*mscript)->active ) {
-		ret = SIEVE_EXEC_FAILURE;
+	sieve_result_set_keep_action
+		(mscript->result, NULL, &act_store);
 
-		if ( (*mscript)->teststream ) {
-			(*mscript)->keep = TRUE;
+	if ( mscript->active ) {
+		if ( mscript->teststream ) {
+			mscript->keep = TRUE;
 		} else {
 			switch ( sieve_result_implicit_keep
 				(result, action_ehandler) ) {
 			case SIEVE_EXEC_OK:
-				(*mscript)->keep = TRUE;
+				mscript->keep = TRUE;
 				break;
 			case SIEVE_EXEC_TEMP_FAILURE:
 				if (!sieve_result_executed(result)) {
@@ -759,12 +762,11 @@
 		}
 	}
 
-	if ( keep != NULL ) *keep = (*mscript)->keep;
+	if ( keep != NULL ) *keep = mscript->keep;
 
 	/* Cleanup */
 	sieve_result_unref(&result);
-	*mscript = NULL;
-
+	*_mscript = NULL;
 	return ret;
 }
 
diff -r f2c5a9f92e0d -r d23225e408af src/lib-sieve/sieve.h
--- a/src/lib-sieve/sieve.h	Sun Nov 15 22:46:01 2015 +0100
+++ b/src/lib-sieve/sieve.h	Wed Nov 18 22:11:31 2015 +0100
@@ -192,15 +192,15 @@
 	(struct sieve_multiscript *mscript, struct sieve_binary *sbin,
 		struct sieve_error_handler *exec_ehandler,
 		struct sieve_error_handler *action_ehandler,
-		enum sieve_runtime_flags flags, bool final);
+		enum sieve_runtime_flags flags);
 
 int sieve_multiscript_status(struct sieve_multiscript *mscript);
 
 int sieve_multiscript_tempfail
-	(struct sieve_multiscript **mscript,
+	(struct sieve_multiscript **_mscript,
 		struct sieve_error_handler *action_ehandler);
 int sieve_multiscript_finish
-	(struct sieve_multiscript **mscript,
+	(struct sieve_multiscript **_mscript,
 		struct sieve_error_handler *action_ehandler, bool *keep);
 
 /*
diff -r f2c5a9f92e0d -r d23225e408af src/plugins/lda-sieve/lda-sieve-plugin.c
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c	Sun Nov 15 22:46:01 2015 +0100
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c	Wed Nov 18 22:11:31 2015 +0100
@@ -528,7 +528,6 @@
 		struct sieve_script *script = scripts[i];
 		enum sieve_compile_flags cpflags = 0;
 		enum sieve_runtime_flags rtflags = 0;
-		bool final = ( i == count - 1 );
 
 		user_script = ( script == srctx->user_script );
 		last_script = script;
@@ -565,7 +564,7 @@
 		action_ehandler = lda_sieve_log_ehandler_create
 			(exec_ehandler, mdctx);
 		more = sieve_multiscript_run(mscript, sbin,
-			exec_ehandler, action_ehandler, rtflags, final);
+			exec_ehandler, action_ehandler, rtflags);
 		sieve_error_handler_unref(&action_ehandler);
 
 		if ( !more ) {
@@ -589,7 +588,7 @@
 				action_ehandler = lda_sieve_log_ehandler_create
 					(exec_ehandler, mdctx);
 				more = sieve_multiscript_run(mscript, sbin,
-					exec_ehandler, action_ehandler, rtflags, final);
+					exec_ehandler, action_ehandler, rtflags);
 				sieve_error_handler_unref(&action_ehandler);
 
 				/* Save new version */
@@ -606,7 +605,7 @@
 
 	/* Finish execution */
 	action_ehandler = lda_sieve_log_ehandler_create
-		(exec_ehandler, mdctx);
+		(srctx->user_ehandler, mdctx);
 	if ( compile_error && error == SIEVE_ERROR_TEMP_FAILURE )
 		ret = sieve_multiscript_tempfail(&mscript, action_ehandler);
 	else
diff -r f2c5a9f92e0d -r d23225e408af src/sieve-tools/sieve-test.c
--- a/src/sieve-tools/sieve-test.c	Sun Nov 15 22:46:01 2015 +0100
+++ b/src/sieve-tools/sieve-test.c	Wed Nov 18 22:11:31 2015 +0100
@@ -362,7 +362,7 @@
 
 				/* Execute/Test script */
 				more = sieve_multiscript_run(mscript, sbin,
-					ehandler, action_ehandler, 0, FALSE);
+					ehandler, action_ehandler, 0);
 			}
 
 			/* Execute/Test main script */
@@ -379,7 +379,7 @@
 				main_sbin = NULL;
 
 				(void)sieve_multiscript_run(mscript, sbin,
-					ehandler, ehandler, 0, TRUE);
+					ehandler, ehandler, 0);
 			}
 
 			result = sieve_multiscript_finish(&mscript, ehandler, NULL);
diff -r f2c5a9f92e0d -r d23225e408af src/testsuite/testsuite-script.c
--- a/src/testsuite/testsuite-script.c	Sun Nov 15 22:46:01 2015 +0100
+++ b/src/testsuite/testsuite-script.c	Wed Nov 18 22:11:31 2015 +0100
@@ -203,7 +203,6 @@
 	for ( i = 0; i < count && more; i++ ) {
 		struct sieve_binary *sbin = NULL;
 		const char *script = scripts[i];
-		bool final = ( i == count - 1 );
 
 		/* Open */
 		if ( (sbin=_testsuite_script_compile(renv, script)) == NULL ) {
@@ -216,7 +215,7 @@
 		sieve_runtime_trace(renv, SIEVE_TRLVL_TESTS, "run script `%s'", script);
 
 		more = sieve_multiscript_run(mscript, sbin,
-			testsuite_log_ehandler, testsuite_log_ehandler, 0, final);
+			testsuite_log_ehandler, testsuite_log_ehandler, 0);
 
 		sieve_close(&sbin);
 	}


More information about the dovecot-cvs mailing list