dovecot: DEBUG: Fixed clearing data stack memory.

dovecot at dovecot.org dovecot at dovecot.org
Sat Dec 22 06:18:11 EET 2007


details:   http://hg.dovecot.org/dovecot/rev/215e96e1f6a3
changeset: 7037:215e96e1f6a3
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Dec 22 06:18:07 2007 +0200
description:
DEBUG: Fixed clearing data stack memory.

diffstat:

1 file changed, 14 insertions(+), 10 deletions(-)
src/lib/data-stack.c |   24 ++++++++++++++----------

diffs (72 lines):

diff -r 1ed56d4064f5 -r 215e96e1f6a3 src/lib/data-stack.c
--- a/src/lib/data-stack.c	Sat Dec 22 06:05:16 2007 +0200
+++ b/src/lib/data-stack.c	Sat Dec 22 06:18:07 2007 +0200
@@ -31,7 +31,7 @@ struct stack_block {
 struct stack_block {
 	struct stack_block *next;
 
-	size_t size, left;
+	size_t size, left, lowwater;
 	/* unsigned char data[]; */
 };
 
@@ -125,20 +125,15 @@ static void free_blocks(struct stack_blo
 	while (block != NULL) {
 		next = block->next;
 
+		if (clean_after_pop)
+			memset(STACK_BLOCK_DATA(block), CLEAR_CHR, block->size);
+
 		if (unused_block == NULL || block->size > unused_block->size) {
-			if (clean_after_pop && unused_block != NULL) {
-				memset(STACK_BLOCK_DATA(unused_block),
-				       CLEAR_CHR, unused_block->size);
-			}
 #ifndef USE_GC
 			free(unused_block);
 #endif
 			unused_block = block;
 		} else {
-			if (clean_after_pop) {
-				memset(STACK_BLOCK_DATA(block), CLEAR_CHR,
-				       block->size);
-			}
 #ifndef USE_GC
 			free(block);
 #endif
@@ -207,11 +202,12 @@ unsigned int t_pop(void)
 
 		pos = current_block->size -
 			current_frame_block->block_space_used[frame_pos];
-		used_size = current_block->size - current_block->left;
+		used_size = current_block->size - current_block->lowwater;
 		memset(STACK_BLOCK_DATA(current_block) + pos, CLEAR_CHR,
 		       used_size - pos);
 	}
 	current_block->left = current_frame_block->block_space_used[frame_pos];
+	current_block->lowwater = current_block->left;
 
 	if (current_block->next != NULL) {
 		/* free unused blocks */
@@ -312,6 +308,12 @@ static void *t_malloc_real(size_t size, 
 		/* enough space in current block, use it */
 		ret = STACK_BLOCK_DATA(current_block) +
 			(current_block->size - current_block->left);
+
+		if (current_block->left - alloc_size <
+		    current_block->lowwater) {
+			current_block->lowwater =
+				current_block->left - alloc_size;
+		}
                 if (permanent)
 			current_block->left -= alloc_size;
 	} else {
@@ -327,6 +329,8 @@ static void *t_malloc_real(size_t size, 
 		}
 
 		block->left = block->size;
+		if (block->left - alloc_size < block->lowwater)
+			block->lowwater = block->left - alloc_size;
 		if (permanent)
 			block->left -= alloc_size;
 		block->next = NULL;


More information about the dovecot-cvs mailing list