svn commit: r431488 - in head/mail/dovecot2-pigeonhole: . files

Larry Rosenman ler at FreeBSD.org
Sat Jan 14 18:28:51 UTC 2017


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 */


More information about the svn-ports-all mailing list