dovecot-2.2-pigeonhole: lib-sieve: Fixed memory leak occurring i...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Sun Nov 29 14:33:30 UTC 2015


details:   http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/d9d6a8e4d0b9
changeset: 2148:d9d6a8e4d0b9
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Sun Nov 29 15:33:25 2015 +0100
description:
lib-sieve: Fixed memory leak occurring in interpreter loop handling.

diffstat:

 src/lib-sieve/sieve-interpreter.c |  23 ++++++++++++++---------
 1 files changed, 14 insertions(+), 9 deletions(-)

diffs (36 lines):

diff -r cfa3025bb14f -r d9d6a8e4d0b9 src/lib-sieve/sieve-interpreter.c
--- a/src/lib-sieve/sieve-interpreter.c	Sun Nov 29 15:28:18 2015 +0100
+++ b/src/lib-sieve/sieve-interpreter.c	Sun Nov 29 15:33:25 2015 +0100
@@ -629,18 +629,23 @@
 	/* Find the loop */
 	i_assert( array_is_created(&interp->loop_stack) );
 	loops = array_get_modifiable(&interp->loop_stack, &count);
-	for ( i = count; i > 0 && &loops[i-1] != loop; i-- )
+	i_assert( count > 0 );
+
+	i = count;
+	do {
 		pool_unref(&loops[i-1].pool);
-	i_assert( i > 0 && &loops[i-1] == loop );
+		i--;
+	} while ( i > 0 && &loops[i] != loop );
+	i_assert( &loops[i] == loop );
+
+	/* Set new loop limit */
+	if ( i > 0 )
+		interp->loop_limit = loops[i].end;
+	else
+		interp->loop_limit = 0;
 
 	/* Delete it and all deeper loops */
-	array_delete(&interp->loop_stack, i-1, count - (i-1));
-
-	/* Set new loop limit */
-	if ( --i > 0 )
-		interp->loop_limit = loops[i-1].end;
-	else
-		interp->loop_limit =- 0;
+	array_delete(&interp->loop_stack, i, count - i);
 
 	/* Trace */
 	if ( sieve_runtime_trace_active(renv, SIEVE_TRLVL_COMMANDS) ) {


More information about the dovecot-cvs mailing list