Date: Sat, 14 Jan 2017 18:28:49 +0000 (UTC) From: Larry Rosenman <ler@FreeBSD.org> To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r431488 - in head/mail/dovecot2-pigeonhole: . files Message-ID: <201701141828.v0EISnVs097983@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ler Date: Sat Jan 14 18:28:49 2017 New Revision: 431488 URL: https://svnweb.freebsd.org/changeset/ports/431488 Log: mail/dovecot2-pigeonhole: lib-sieve: Fixed handling of an early explicit keep during multiscript execution. Applies to LDA/LMTP context in general, not only when sieve_before/sieve_after are used. Action side-effects and the message snapshot would be lost at the final stage where the implicit keep is evaluated. This happened because the keep action itself is not actually executed, but rather its presence is noted to determine whether more scripts need to be executed. So, when finally execution of the actual keep action is due, i.e. when there are no more scripts in the sequence, it overrides the explicit keep from the last script. This didn't take the side-effects and message snapshot into account. Approved by: adamw (Mentor) Obtained from: https://github.com/dovecot/pigeonhole/commit/772485538302957ebada484b6eedec57136bc737 Differential Revision: https://reviews.freebsd.org/D9177 Added: head/mail/dovecot2-pigeonhole/files/patch-src_lib-sieve_sieve-result.c (contents, props changed) Modified: head/mail/dovecot2-pigeonhole/Makefile Modified: head/mail/dovecot2-pigeonhole/Makefile ============================================================================== --- head/mail/dovecot2-pigeonhole/Makefile Sat Jan 14 18:14:30 2017 (r431487) +++ head/mail/dovecot2-pigeonhole/Makefile Sat Jan 14 18:28:49 2017 (r431488) @@ -3,7 +3,7 @@ PORTNAME= dovecot-pigeonhole PORTVERSION= 0.4.16 -PORTREVISION= 4 +PORTREVISION= 5 CATEGORIES= mail MASTER_SITES= http://pigeonhole.dovecot.org/releases/${DOVECOTVERSION}/ DISTNAME= ${PORTNAME:C/-/-${DOVECOTVERSION}-/}-${PORTVERSION} Added: head/mail/dovecot2-pigeonhole/files/patch-src_lib-sieve_sieve-result.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/mail/dovecot2-pigeonhole/files/patch-src_lib-sieve_sieve-result.c Sat Jan 14 18:28:49 2017 (r431488) @@ -0,0 +1,87 @@ +--- src/lib-sieve/sieve-result.c.orig 2016-10-20 22:48:08 UTC ++++ src/lib-sieve/sieve-result.c +@@ -928,7 +928,7 @@ static int _sieve_result_implicit_keep + (struct sieve_result *result, bool rollback) + { + const struct sieve_action_exec_env *aenv = &result->action_env; +- struct sieve_result_action *rac; ++ struct sieve_result_action *rac, *kac; + int status = SIEVE_EXEC_OK; + struct sieve_result_side_effect *rsef, *rsef_first = NULL; + void *tr_context = NULL; +@@ -937,38 +937,54 @@ static int _sieve_result_implicit_keep + if ( (aenv->flags & SIEVE_EXECUTE_FLAG_DEFER_KEEP) != 0 ) + return SIEVE_EXEC_OK; + +- if ( rollback ) { ++ if ( rollback ) + act_keep = result->failure_action; +- act_keep.mail = NULL; +- } else { ++ else + act_keep = result->keep_action; +- act_keep.mail = sieve_message_get_mail(aenv->msgctx); +- } ++ act_keep.mail = NULL; + + /* If keep is a non-action, return right away */ + if ( act_keep.def == NULL ) + return SIEVE_EXEC_OK; + +- /* Scan for execution of keep-equal actions */ +- rac = result->first_action; +- while ( rac != NULL ) { +- if ( rac->action.def == act_keep.def && act_keep.def->equals != NULL && +- act_keep.def->equals(aenv->scriptenv, NULL, &rac->action) && +- rac->action.executed ) +- return SIEVE_EXEC_OK; +- +- rac = rac->next; ++ /* Scan for deferred keep */ ++ kac = result->last_action; ++ while ( kac != NULL && kac->action.executed ) { ++ if ( kac->keep && kac->action.def == NULL ) ++ break; ++ kac = kac->prev; + } + +- /* Apply any implicit side effects if applicable */ +- if ( !rollback && hash_table_is_created(result->action_contexts) ) { +- struct sieve_result_action_context *actctx; ++ if (kac == NULL) { ++ if ( !rollback ) ++ act_keep.mail = sieve_message_get_mail(aenv->msgctx); + +- /* Check for implicit side effects to keep action */ +- actctx = hash_table_lookup(result->action_contexts, act_keep.def); ++ /* Scan for execution of keep-equal actions */ ++ rac = result->first_action; ++ while ( rac != NULL ) { ++ if ( rac->action.def == act_keep.def && act_keep.def->equals != NULL && ++ act_keep.def->equals(aenv->scriptenv, NULL, &rac->action) && ++ rac->action.executed ) ++ return SIEVE_EXEC_OK; + +- if ( actctx != NULL && actctx->seffects != NULL ) +- rsef_first = actctx->seffects->first_effect; ++ rac = rac->next; ++ } ++ ++ /* Apply any implicit side effects if applicable */ ++ if ( !rollback && hash_table_is_created(result->action_contexts) ) { ++ struct sieve_result_action_context *actctx; ++ ++ /* Check for implicit side effects to keep action */ ++ actctx = hash_table_lookup(result->action_contexts, act_keep.def); ++ ++ if ( actctx != NULL && actctx->seffects != NULL ) ++ rsef_first = actctx->seffects->first_effect; ++ } ++ } else if ( !rollback ) { ++ act_keep.location = kac->action.location; ++ act_keep.mail = kac->action.mail; ++ if ( kac->seffects != NULL ) ++ rsef_first = kac->seffects->first_effect; + } + + /* Start keep action */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201701141828.v0EISnVs097983>