From 30b8858d941a06c2bce9f819f51287dbad5f221f Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Wed, 2 Sep 2009 20:36:19 +0200
Subject: [PATCH] Fixed segfault bug triggered by merging side effects in
 duplicate actions.

---
 src/lib-sieve/sieve-result.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c
index 21bae05e7..3308ce440 100644
--- a/src/lib-sieve/sieve-result.c
+++ b/src/lib-sieve/sieve-result.c
@@ -285,10 +285,11 @@ void sieve_result_add_implicit_side_effect
 }
 
 static int sieve_result_side_effects_merge
-(const struct sieve_runtime_env *renv, const struct sieve_action *action, 
-	struct sieve_side_effects_list *old_seffects,
+(const struct sieve_runtime_env *renv, const struct sieve_action *action,
+	struct sieve_result_action *old_action,
 	struct sieve_side_effects_list *new_seffects)
-{
+{ 
+	struct sieve_side_effects_list *old_seffects = old_action->seffects;
 	int ret;
 	struct sieve_result_side_effect *rsef, *nrsef;
 
@@ -353,6 +354,10 @@ static int sieve_result_side_effects_merge
 					return -1;
 					
 				if ( ret != 0 ) {
+					if ( old_action->seffects == NULL )
+						old_action->seffects = old_seffects =
+							sieve_side_effects_list_create(old_action->result);					
+
 					/* Add side effect */
 					sieve_side_effects_list_add(old_seffects, seffect, new_context);
 				}
@@ -421,13 +426,13 @@ static int _sieve_result_add_action
 					kaction = raction;
 			
 				if ( (ret=sieve_result_side_effects_merge
-					(renv, action, kaction->seffects, seffects)) <= 0 )	 
+					(renv, action, kaction, seffects)) <= 0 )	 
 					return ret;				
 			} else {
 				/* True duplicate */
 				
 				return sieve_result_side_effects_merge
-					(renv, action, raction->seffects, seffects);
+					(renv, action, raction, seffects);
 			}
 			
 		} if ( raction->data.action == action ) {
@@ -448,7 +453,7 @@ static int _sieve_result_add_action
 						 */
 						 
 						if ( (ret=sieve_result_side_effects_merge
-							(renv, action, raction->seffects, seffects)) < 0 ) 
+							(renv, action, raction, seffects)) < 0 ) 
 							return ret;
 						 
 						if ( kaction == NULL ) {								
@@ -465,13 +470,13 @@ static int _sieve_result_add_action
 							sieve_result_action_detach(raction);
 
 							if ( (ret=sieve_result_side_effects_merge
-								(renv, action, kaction->seffects, raction->seffects)) < 0 ) 
+								(renv, action, kaction, raction->seffects)) < 0 ) 
 								return ret;
 						}
 					} else {
 						/* Merge side-effects, but don't add new action */
 						return sieve_result_side_effects_merge
-							(renv, action, raction->seffects, seffects);
+							(renv, action, raction, seffects);
 					}
 				}
 			}
-- 
GitLab