diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c index 3308ce4406ac350d98b71f657ed2907ebf97be38..c622273bd12331ca4c61aa2e18e9b2436e22c616 100644 --- a/src/lib-sieve/sieve-result.c +++ b/src/lib-sieve/sieve-result.c @@ -379,6 +379,9 @@ static void sieve_result_action_detach(struct sieve_result_action *raction) if ( result->last_action == raction ) result->last_action = raction->prev; + + if ( result->last_attempted_action == raction ) + result->last_attempted_action = raction->prev; if ( raction->next != NULL ) raction->next->prev = raction->prev; if ( raction->prev != NULL ) raction->prev->next = raction->next; @@ -406,7 +409,7 @@ static int _sieve_result_add_action act_data.location = sieve_error_script_location(renv->script, source_line); act_data.context = context; act_data.executed = FALSE; - + /* First, check for duplicates or conflicts */ raction = result->first_action; while ( raction != NULL ) { @@ -415,7 +418,7 @@ static int _sieve_result_add_action if ( keep && raction->keep ) { /* Duplicate keep */ - if ( raction->data.executed ) { + if ( raction->data.action == NULL || raction->data.executed ) { /* Keep action from preceeding execution */ /* Detach existing keep action */ @@ -430,12 +433,11 @@ static int _sieve_result_add_action return ret; } else { /* True duplicate */ - return sieve_result_side_effects_merge (renv, action, raction, seffects); } - } if ( raction->data.action == action ) { + } if ( action != NULL && raction->data.action == action ) { instance_count++; /* Possible duplicate */ @@ -509,10 +511,10 @@ static int _sieve_result_add_action return -1; } - if ( kaction != NULL ) + if ( kaction != NULL ) { /* Use existing keep action to define new one */ raction = kaction; - else { + } else { /* Create new action object */ raction = p_new(result->pool, struct sieve_result_action, 1); raction->data.executed = FALSE;