make using canaries optional

default to  use-canaries  since that is the current behaviour


svn path=/trunk/; revision=17563
This commit is contained in:
Ronnie Sahlberg 2006-03-10 05:39:57 +00:00
parent eec9a1e95a
commit 8a9e493359
1 changed files with 49 additions and 3 deletions

View File

@ -62,6 +62,10 @@
/* Do we want to use guardpages? if available */
#define WANT_GUARD_PAGES 1
/* Do we want to use canaries ? */
#define DEBUG_USE_CANARIES 1
#ifdef WANT_GUARD_PAGES
/* Add guard pages at each end of our allocated memory */
#if defined(HAVE_SYSCONF) && defined(HAVE_MMAP) && defined(HAVE_MPROTECT) && defined(HAVE_STDINT_H)
@ -79,9 +83,11 @@
#define EMEM_ALLOCS_PER_CHUNK (EMEM_PACKET_CHUNK_SIZE / 512)
#ifdef DEBUG_USE_CANARIES
#define EMEM_CANARY_SIZE 8
#define EMEM_CANARY_DATA_SIZE (EMEM_CANARY_SIZE * 2 - 1)
guint8 ep_canary[EMEM_CANARY_DATA_SIZE], se_canary[EMEM_CANARY_DATA_SIZE];
#endif /* DEBUG_USE_CANARIES */
typedef struct _emem_chunk_t {
struct _emem_chunk_t *next;
@ -90,11 +96,13 @@ typedef struct _emem_chunk_t {
unsigned int free_offset_init;
unsigned int free_offset;
char *buf;
#ifdef DEBUG_USE_CANARIES
#if ! defined(EP_DEBUG_FREE) && ! defined(SE_DEBUG_FREE)
unsigned int c_count;
void *canary[EMEM_ALLOCS_PER_CHUNK];
guint8 cmp_len[EMEM_ALLOCS_PER_CHUNK];
#endif
#endif /* DEBUG_USE_CANARIES */
} emem_chunk_t;
typedef struct _emem_header_t {
@ -105,10 +113,11 @@ typedef struct _emem_header_t {
static emem_header_t ep_packet_mem;
static emem_header_t se_packet_mem;
#ifdef DEBUG_USE_CANARIES
/*
* Set a canary value to be placed between memchunks.
*/
void
emem_canary(guint8 *canary) {
int i;
@ -163,6 +172,8 @@ emem_canary_pad (size_t allocation) {
return pad;
}
#endif
#endif /* DEBUG_USE_CANARIES */
/* Initialize the packet-lifetime memory allocation pool.
* This function should be called only once when Ethereal or Tethereal starts
@ -174,7 +185,9 @@ ep_init_chunk(void)
ep_packet_mem.free_list=NULL;
ep_packet_mem.used_list=NULL;
#ifdef DEBUG_USE_CANARIES
emem_canary(ep_canary);
#endif /* DEBUG_USE_CANARIES */
}
/* Initialize the capture-lifetime memory allocation pool.
* This function should be called only once when Ethereal or Tethereal starts
@ -186,7 +199,9 @@ se_init_chunk(void)
se_packet_mem.free_list=NULL;
se_packet_mem.used_list=NULL;
#ifdef DEBUG_USE_CANARIES
emem_canary(se_canary);
#endif /* DEBUG_USE_CANARIES */
}
#if !defined(SE_DEBUG_FREE)
@ -208,9 +223,12 @@ emem_create_chunk(emem_chunk_t **free_list) {
emem_chunk_t *npc;
npc = g_malloc(sizeof(emem_chunk_t));
npc->next = NULL;
#ifdef DEBUG_USE_CANARIES
#if ! defined(EP_DEBUG_FREE) && ! defined(SE_DEBUG_FREE)
npc->c_count = 0;
#endif
#endif /* DEBUG_USE_CANARIES */
*free_list = npc;
#if defined (_WIN32)
/*
@ -278,8 +296,12 @@ ep_alloc(size_t size)
{
void *buf;
#ifndef EP_DEBUG_FREE
#ifdef DEBUG_USE_CANARIES
void *cptr;
guint8 pad = emem_canary_pad(size);
#else
static guint8 pad=8;
#endif /* DEBUG_USE_CANARIES */
emem_chunk_t *free_list;
#endif
@ -297,7 +319,11 @@ ep_alloc(size_t size)
/* oops, we need to allocate more memory to serve this request
* than we have free. move this node to the used list and try again
*/
if(size>ep_packet_mem.free_list->amount_free || ep_packet_mem.free_list->c_count >= EMEM_ALLOCS_PER_CHUNK){
if(size>ep_packet_mem.free_list->amount_free
#ifdef DEBUG_USE_CANARIES
|| ep_packet_mem.free_list->c_count >= EMEM_ALLOCS_PER_CHUNK
#endif /* DEBUG_USE_CANARIES */
){
emem_chunk_t *npc;
npc=ep_packet_mem.free_list;
ep_packet_mem.free_list=ep_packet_mem.free_list->next;
@ -314,11 +340,13 @@ ep_alloc(size_t size)
free_list->amount_free -= size;
free_list->free_offset += size;
#ifdef DEBUG_USE_CANARIES
cptr = (char *)buf + size - pad;
memcpy(cptr, &ep_canary, pad);
free_list->canary[free_list->c_count] = cptr;
free_list->cmp_len[free_list->c_count] = pad;
free_list->c_count++;
#endif /* DEBUG_USE_CANARIES */
#else /* EP_DEBUG_FREE */
emem_chunk_t *npc;
@ -342,8 +370,12 @@ se_alloc(size_t size)
{
void *buf;
#ifndef SE_DEBUG_FREE
#ifdef DEBUG_USE_CANARIES
void *cptr;
guint8 pad = emem_canary_pad(size);
#else
static guint8 pad=8;
#endif /* DEBUG_USE_CANARIES */
emem_chunk_t *free_list;
#endif
@ -361,7 +393,11 @@ se_alloc(size_t size)
/* oops, we need to allocate more memory to serve this request
* than we have free. move this node to the used list and try again
*/
if(size>se_packet_mem.free_list->amount_free || se_packet_mem.free_list->c_count >= EMEM_ALLOCS_PER_CHUNK){
if(size>se_packet_mem.free_list->amount_free
#ifdef DEBUG_USE_CANARIES
|| se_packet_mem.free_list->c_count >= EMEM_ALLOCS_PER_CHUNK
#endif /* DEBUG_USE_CANARIES */
){
emem_chunk_t *npc;
npc=se_packet_mem.free_list;
se_packet_mem.free_list=se_packet_mem.free_list->next;
@ -378,11 +414,13 @@ se_alloc(size_t size)
free_list->amount_free -= size;
free_list->free_offset += size;
#ifdef DEBUG_USE_CANARIES
cptr = (char *)buf + size - pad;
memcpy(cptr, &se_canary, pad);
free_list->canary[free_list->c_count] = cptr;
free_list->cmp_len[free_list->c_count] = pad;
free_list->c_count++;
#endif /* DEBUG_USE_CANARIES */
#else /* SE_DEBUG_FREE */
emem_chunk_t *npc;
@ -606,7 +644,9 @@ ep_free_all(void)
{
emem_chunk_t *npc;
#ifndef EP_DEBUG_FREE
#ifdef DEBUG_USE_CANARIES
guint i;
#endif /* DEBUG_USE_CANARIES */
#endif
/* move all used chunks over to the free list */
@ -621,11 +661,13 @@ ep_free_all(void)
npc = ep_packet_mem.free_list;
while (npc != NULL) {
#ifndef EP_DEBUG_FREE
#ifdef DEBUG_USE_CANARIES
for (i = 0; i < npc->c_count; i++) {
if (memcmp(npc->canary[i], &ep_canary, npc->cmp_len[i]) != 0)
g_error("Per-packet memory corrupted.");
}
npc->c_count = 0;
#endif /* DEBUG_USE_CANARIES */
npc->amount_free = npc->amount_free_init;
npc->free_offset = npc->free_offset_init;
npc = npc->next;
@ -650,7 +692,9 @@ se_free_all(void)
emem_chunk_t *npc;
se_tree_t *se_tree_list;
#ifndef SE_DEBUG_FREE
#ifdef DEBUG_USE_CANARIES
guint i;
#endif /* DEBUG_USE_CANARIES */
#endif
@ -666,11 +710,13 @@ se_free_all(void)
npc = se_packet_mem.free_list;
while (npc != NULL) {
#ifndef SE_DEBUG_FREE
#ifdef DEBUG_USE_CANARIES
for (i = 0; i < npc->c_count; i++) {
if (memcmp(npc->canary[i], &se_canary, npc->cmp_len[i]) != 0)
g_error("Per-session memory corrupted.");
}
npc->c_count = 0;
#endif /* DEBUG_USE_CANARIES */
npc->amount_free = npc->amount_free_init;
npc->free_offset = npc->free_offset_init;
npc = npc->next;