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