diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c index 4851e6980f11b338a23b6f71c867ada384858d40..aa730b9dc2f7c89dcce3573658f653af4d482847 100644 --- a/src/lib-sieve/sieve.c +++ b/src/lib-sieve/sieve.c @@ -878,50 +878,9 @@ int sieve_multiscript_status(struct sieve_multiscript *mscript) return mscript->status; } -int sieve_multiscript_tempfail(struct sieve_multiscript **_mscript, - struct sieve_error_handler *action_ehandler, - enum sieve_execute_flags flags) -{ - struct sieve_multiscript *mscript = *_mscript; - - if (mscript == NULL) - return SIEVE_EXEC_OK; - *_mscript = NULL; - - struct sieve_result *result = mscript->result; - int ret = mscript->status; - - mscript->exec_env.flags = flags; - sieve_result_set_keep_action(mscript->result, NULL, &act_store); - - if (mscript->active) { - ret = SIEVE_EXEC_TEMP_FAILURE; - - if (mscript->teststream == NULL && - sieve_result_executed(result)) { - /* Part of the result is already executed, need to fall - back to to implicit keep (FIXME) - */ - switch (sieve_result_implicit_keep( - result, action_ehandler, FALSE)) { - case SIEVE_EXEC_OK: - ret = SIEVE_EXEC_FAILURE; - break; - default: - ret = SIEVE_EXEC_KEEP_FAILED; - } - } - } - - /* Cleanup */ - sieve_multiscript_destroy(&mscript); - - return ret; -} - int sieve_multiscript_finish(struct sieve_multiscript **_mscript, struct sieve_error_handler *action_ehandler, - enum sieve_execute_flags flags) + enum sieve_execute_flags flags, int status) { struct sieve_multiscript *mscript = *_mscript; @@ -929,39 +888,41 @@ int sieve_multiscript_finish(struct sieve_multiscript **_mscript, return SIEVE_EXEC_OK; *_mscript = NULL; - struct sieve_result *result = mscript->result; - int ret = mscript->status; - mscript->exec_env.flags = flags; sieve_result_set_keep_action(mscript->result, NULL, &act_store); if (mscript->active) { - if (mscript->teststream != NULL) - mscript->keep = TRUE; - else { + if (mscript->teststream != NULL) { + if (status != SIEVE_EXEC_TEMP_FAILURE) + mscript->keep = TRUE; + } else if (status != SIEVE_EXEC_TEMP_FAILURE || + sieve_result_executed(mscript->result)) { switch (sieve_result_implicit_keep( - result, action_ehandler, TRUE)) { + mscript->result, action_ehandler, TRUE)) { case SIEVE_EXEC_OK: mscript->keep = TRUE; break; case SIEVE_EXEC_TEMP_FAILURE: - if (!sieve_result_executed(result)) { - ret = SIEVE_EXEC_TEMP_FAILURE; + if (!sieve_result_executed(mscript->result)) { + status = SIEVE_EXEC_TEMP_FAILURE; break; } /* fall through */ default: - ret = SIEVE_EXEC_KEEP_FAILED; + status = SIEVE_EXEC_KEEP_FAILED; } } } - sieve_result_finish(result, action_ehandler, (ret == SIEVE_EXEC_OK)); + if (status != SIEVE_EXEC_TEMP_FAILURE) { + sieve_result_finish(mscript->result, action_ehandler, + (status == SIEVE_EXEC_OK)); + } /* Cleanup */ sieve_multiscript_destroy(&mscript); - return ret; + return status; } /* diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h index f4acafe910edfd24c0b2bafc8c100e8f36dab52c..3c47e2041a119d3d28f833067ab06f0c1fc33d89 100644 --- a/src/lib-sieve/sieve.h +++ b/src/lib-sieve/sieve.h @@ -182,12 +182,9 @@ void sieve_multiscript_run_discard(struct sieve_multiscript *mscript, int sieve_multiscript_status(struct sieve_multiscript *mscript); -int sieve_multiscript_tempfail(struct sieve_multiscript **_mscript, - struct sieve_error_handler *action_ehandler, - enum sieve_execute_flags flags); int sieve_multiscript_finish(struct sieve_multiscript **_mscript, struct sieve_error_handler *action_ehandler, - enum sieve_execute_flags flags); + enum sieve_execute_flags flags, int status); /* * Configured limits diff --git a/src/plugins/imap-filter-sieve/imap-filter-sieve.c b/src/plugins/imap-filter-sieve/imap-filter-sieve.c index eb68057d4f2d4c4dab8d4579502a6b3c48a704af..fe6e4a81e128fcbddab3e85ff5f3bdd78a8a88d6 100644 --- a/src/plugins/imap-filter-sieve/imap-filter-sieve.c +++ b/src/plugins/imap-filter-sieve/imap-filter-sieve.c @@ -872,15 +872,18 @@ imap_sieve_filter_run_scripts(struct imap_filter_sieve_context *sctx, ehandler = (user_ehandler != NULL ? user_ehandler : ifsuser->master_ehandler); if (compile_error == SIEVE_ERROR_TEMP_FAILURE) { - ret = sieve_multiscript_tempfail(&mscript, ehandler, exflags); + ret = sieve_multiscript_finish(&mscript, ehandler, exflags, + SIEVE_EXEC_TEMP_FAILURE); } else if (rusage_exceeded) { i_assert(last_script != NULL); - (void)sieve_multiscript_tempfail(&mscript, ehandler, exflags); + (void)sieve_multiscript_finish(&mscript, ehandler, exflags, + SIEVE_EXEC_TEMP_FAILURE); sieve_error(ehandler, sieve_script_name(last_script), "cumulative resource usage limit exceeded"); ret = SIEVE_EXEC_RESOURCE_LIMIT; } else { - ret = sieve_multiscript_finish(&mscript, ehandler, exflags); + ret = sieve_multiscript_finish(&mscript, ehandler, exflags, + SIEVE_EXEC_OK); } /* Don't log additional messages about compile failure */ diff --git a/src/plugins/imapsieve/imap-sieve.c b/src/plugins/imapsieve/imap-sieve.c index 480d3847bab48f501e14ae6ef1d62bbe6e6cb73a..e5b08947bda1c785c541c6d1fce8f64574fdaeba 100644 --- a/src/plugins/imapsieve/imap-sieve.c +++ b/src/plugins/imapsieve/imap-sieve.c @@ -793,15 +793,18 @@ imap_sieve_run_scripts(struct imap_sieve_run *isrun, ehandler = (isrun->user_ehandler != NULL ? isrun->user_ehandler : isieve->master_ehandler); if (compile_error == SIEVE_ERROR_TEMP_FAILURE) { - ret = sieve_multiscript_tempfail(&mscript, ehandler, exflags); + ret = sieve_multiscript_finish(&mscript, ehandler, exflags, + SIEVE_EXEC_TEMP_FAILURE); } else if (rusage_exceeded) { i_assert(last_script != NULL); - (void)sieve_multiscript_tempfail(&mscript, ehandler, exflags); + (void)sieve_multiscript_finish(&mscript, ehandler, exflags, + SIEVE_EXEC_TEMP_FAILURE); sieve_error(ehandler, sieve_script_name(last_script), "cumulative resource usage limit exceeded"); ret = SIEVE_EXEC_RESOURCE_LIMIT; } else { - ret = sieve_multiscript_finish(&mscript, ehandler, exflags); + ret = sieve_multiscript_finish(&mscript, ehandler, exflags, + SIEVE_EXEC_OK); } /* Don't log additional messages about compile failure */ diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c index 98b5b2f2ebb9e55ed0c835ecf28b92881096bfd7..60b3b18856921d4fd31e02641348763d550f05d0 100644 --- a/src/plugins/lda-sieve/lda-sieve-plugin.c +++ b/src/plugins/lda-sieve/lda-sieve-plugin.c @@ -663,13 +663,10 @@ static int lda_sieve_execute_scripts(struct lda_sieve_run_context *srctx) /* Finish execution */ exec_ehandler = (srctx->user_ehandler != NULL ? srctx->user_ehandler : srctx->master_ehandler); - if (error == SIEVE_ERROR_TEMP_FAILURE) { - ret = sieve_multiscript_tempfail(&mscript, exec_ehandler, - exflags); - } else { - ret = sieve_multiscript_finish(&mscript, exec_ehandler, - exflags); - } + ret = sieve_multiscript_finish(&mscript, exec_ehandler, exflags, + (error == SIEVE_ERROR_TEMP_FAILURE ? + SIEVE_EXEC_TEMP_FAILURE : + SIEVE_EXEC_OK)); /* Don't log additional messages about compile failure */ if (error != SIEVE_ERROR_NONE && ret == SIEVE_EXEC_FAILURE) { diff --git a/src/sieve-tools/sieve-test.c b/src/sieve-tools/sieve-test.c index c5d7523d2f83df71f3fa1abb7c79a450ff0f7f72..08059cb7c1f9ec7d4f70d19a9dd69f6bcb1c93e7 100644 --- a/src/sieve-tools/sieve-test.c +++ b/src/sieve-tools/sieve-test.c @@ -441,7 +441,7 @@ int main(int argc, char **argv) } result = sieve_multiscript_finish( - &mscript, ehandler, exflags); + &mscript, ehandler, exflags, ret); ret = (ret > 0 ? result : ret); } diff --git a/src/testsuite/testsuite-script.c b/src/testsuite/testsuite-script.c index 3cfaafab02bc121bfb6fdb488f2b9f626f8e1312..7c89ecd24374cb06443d75bcd787a9d7985fd755 100644 --- a/src/testsuite/testsuite-script.c +++ b/src/testsuite/testsuite-script.c @@ -251,5 +251,5 @@ bool testsuite_script_multiscript(const struct sieve_runtime_env *renv, } return (sieve_multiscript_finish(&mscript, testsuite_log_ehandler, - 0) > 0 && result); + 0, SIEVE_EXEC_OK) > 0 && result); }