X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/184e88237dea64ce48076cdd0184612d057cbafd..261dc43e32f6039781ca92535e56f5caaa68b809:/src/src/store.c diff --git a/src/src/store.c b/src/src/store.c index da4800f60..460374235 100644 --- a/src/src/store.c +++ b/src/src/store.c @@ -1,10 +1,10 @@ -/* $Cambridge: exim/src/src/store.c,v 1.4 2007/01/08 10:50:18 ph10 Exp $ */ +/* $Cambridge: exim/src/src/store.c,v 1.5 2009/11/16 19:50:37 nm4 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2007 */ +/* Copyright (c) University of Cambridge 1995 - 2009 */ /* See the file NOTICE for conditions of use and distribution. */ /* Exim gets and frees all its store through these functions. In the original @@ -41,6 +41,7 @@ The following different types of store are recognized: #include "exim.h" +#include "memcheck.h" /* We need to know how to align blocks of data for general use. I'm not sure @@ -175,6 +176,7 @@ if (size > yield_length[store_pool]) yield_length[store_pool] = newblock->length; next_yield[store_pool] = (void *)((char *)current_block[store_pool] + ALIGNED_SIZEOF_STOREBLOCK); + VALGRIND_MAKE_MEM_NOACCESS(next_yield[store_pool], yield_length[store_pool]); } /* There's (now) enough room in the current block; the yield is the next @@ -199,6 +201,7 @@ DEBUG(D_memory) } #endif /* COMPILE_UTILITY */ +VALGRIND_MAKE_MEM_UNDEFINED(store_last_get[store_pool], size); /* Update next pointer and number of bytes left in the current block. */ next_yield[store_pool] = (void *)((char *)next_yield[store_pool] + size); @@ -293,6 +296,7 @@ DEBUG(D_memory) if (newsize % alignment != 0) newsize += alignment - (newsize % alignment); next_yield[store_pool] = (char *)ptr + newsize; yield_length[store_pool] -= newsize - rounded_oldsize; +VALGRIND_MAKE_MEM_UNDEFINED(ptr + oldsize, inc); return TRUE; } @@ -351,6 +355,7 @@ newlength = bc + b->length - (char *)ptr; #ifndef COMPILE_UTILITY if (running_in_test_harness) memset(ptr, 0xF0, newlength); #endif +VALGRIND_MAKE_MEM_NOACCESS(ptr, newlength); yield_length[store_pool] = newlength - (newlength % alignment); next_yield[store_pool] = (char *)ptr + (newlength % alignment); current_block[store_pool] = b; @@ -362,7 +367,10 @@ flapping memory. However, keep this block only when it has the default size. */ if (yield_length[store_pool] < STOREPOOL_MIN_SIZE && b->next != NULL && b->next->length == STORE_BLOCK_SIZE) + { b = b->next; + VALGRIND_MAKE_MEM_NOACCESS((char *)b + ALIGNED_SIZEOF_STOREBLOCK, b->length - ALIGNED_SIZEOF_STOREBLOCK); + } bb = b->next; b->next = NULL;