[prev in list] [next in list] [prev in thread] [next in thread] 

List:       dovecot-cvs
Subject:    dovecot-2.2-pigeonhole: lib-sieve: Fixed memory leak occurring i...
From:       pigeonhole () rename-it ! nl (pigeonhole at rename-it ! nl)
Date:       2015-11-29 14:33:30
Message-ID: hg.d9d6a8e4d0b9.1448807610.343897724 () sinalco ! rename-it ! nl
[Download RAW message or body]

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) ) {

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic