-/* $Cambridge: exim/src/src/store.c,v 1.1 2004/10/07 10:39:01 ph10 Exp $ */
-
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) University of Cambridge 1995 - 2004 */
+/* Copyright (c) University of Cambridge 1995 - 2012 */
/* See the file NOTICE for conditions of use and distribution. */
/* Exim gets and frees all its store through these functions. In the original
#include "exim.h"
+/* keep config.h before memcheck.h, for NVALGRIND */
+#include "config.h"
+
+#include "memcheck.h"
/* We need to know how to align blocks of data for general use. I'm not sure
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
}
#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);
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;
}
if ((char *)ptr >= bc && (char *)ptr <= bc + b->length) break;
}
if (b == NULL)
- log_write(0, LOG_MAIN|LOG_PANIC_DIE, "internal error: store_reset(%d) "
+ log_write(0, LOG_MAIN|LOG_PANIC_DIE, "internal error: store_reset(%p) "
"failed: pool=%d %-14s %4d", ptr, store_pool, filename, linenumber);
}
#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;
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;