91 #include "gw-config.h" 111 #define NEW_AREA_PATTERN 0xcafebabe 115 #define FREE_AREA_PATTERN 0xdeadbeef 119 #define START_MARK_PATTERN 0xdadaface 122 #define END_MARK_PATTERN 0xadadafec 141 const char *
function;
164 #define MARKER_SIZE 16 167 #define MAX_TAB_SIZE (100*1024*1024L) 168 #define MAX_ALLOCATIONS ((long) (MAX_TAB_SIZE/sizeof(struct area))) 175 #define FREE_RING_SIZE 1024 215 for (i = 32; i < 0x80000000L; i <<= 1) {
222 if (num <= 0x80000000L)
229 static void fill(
unsigned char *p,
size_t bytes,
long pattern)
231 while (bytes >
sizeof(pattern)) {
232 memcpy(p, &pattern,
sizeof(pattern));
233 p +=
sizeof(pattern);
234 bytes -=
sizeof(pattern);
237 memcpy(p, &pattern, bytes);
241 static int untouched(
unsigned char *p,
size_t bytes,
long pattern)
243 while (bytes >
sizeof(pattern)) {
244 if (memcmp(p, &pattern,
sizeof(pattern)) != 0)
246 p +=
sizeof(pattern);
247 bytes -=
sizeof(pattern);
249 if (bytes > 0 && memcmp(p, &pattern, bytes) != 0)
298 error(0,
"Start marker was damaged for area %ld", index);
302 error(0,
"End marker was damaged for area %ld", index);
311 debug(
"gwlib.gwmem", 0,
"Area %p, size %ld, max_size %ld",
313 debug(
"gwlib.gwmem", 0,
"Allocated by %s() at %s:%ld",
318 debug(
"gwlib.gwmem", 0,
"Re-allocated by %s() at %s:%ld",
324 debug(
"gwlib.gwmem", 0,
"Claimed by %s() at %s:%ld",
337 sprintf(strchr(buf,
'\0'),
"%02x ", p[i]);
339 debug(
"gwlib.gwmem", 0,
"Contents of area (first %d bytes):",
MAX_DUMP);
340 debug(
"gwlib.gwmem", 0,
" %s", buf);
345 char **strings = backtrace_symbols(
area->frames,
area->frame_size);
346 debug(
"gwlib.gwmem", 0,
"Backtrace of last malloc/realloc:");
347 for (i = 0; i <
area->frame_size; i++) {
349 debug(
"gwlib.gwmem", 0,
"%s", strings[i]);
351 debug(
"gwlib.gwmem", 0,
"%p",
area->frames[i]);
362 long suspicious_pointer;
367 p_ul = (
unsigned long) p;
369 (
sizeof(p) ==
sizeof(
long) &&
373 if (
slow || suspicious_pointer) {
382 error(0,
"Area %p not found in allocation table.", p);
392 error(0,
"End marker was damaged for area %p", p);
398 error(0,
"Start marker was damaged for area %p", p);
407 error(0,
"Could not find area information.");
419 const char *
filename,
long lineno,
const char *
function)
422 static struct area empty_area;
425 panic(0,
"Too many concurrent allocations.");
437 area->frame_size = backtrace(
area->frames,
sizeof(
area->frames) /
sizeof(
void*));
469 error(0,
"Freed area %p has been tampered with.",
area->
area);
515 const char *
function)
526 panic(errno,
"Memory allocation of %ld bytes failed.", (
long)
size);
538 const char *
function)
550 panic(errno,
"Memory allocation of %ld bytes failed.", (
long)
size);
562 long lineno,
const char *
function)
576 panic(0,
"Realloc called on non-allocated area");
581 }
else if (size <= area->
max_size) {
590 struct area *new_area;
592 unsigned char *new_p;
620 const char *
function)
632 panic(0,
"Free called on non-allocated area");
640 const char *
function)
648 size = strlen(str) + 1;
650 memcpy(copy, str,
size);
655 const char *
function)
667 panic(0,
"Claim_area called on non-allocated area");
681 long calculated_size;
698 debug(
"gwlib.gwmem", 0,
"----------------------------------------");
699 debug(
"gwlib.gwmem", 0,
"Current allocations: %ld areas, %ld bytes",
701 debug(
"gwlib.gwmem", 0,
"Highest number of allocations: %ld areas",
703 debug(
"gwlib.gwmem", 0,
"Highest memory usage: %ld bytes",
732 warning(0,
"Area_size called on non-allocated area %p", p);
void error(int err, const char *fmt,...)
static struct area * find_area(unsigned char *p)
static void drop_from_free_ring(long index)
void * gw_check_calloc(int nmemb, size_t size, const char *filename, long lineno, const char *function)
static void fill(unsigned char *p, size_t bytes, long pattern)
gw_assert(wtls_machine->packet_to_send !=NULL)
static void startmark(unsigned char *p, long number)
char * gw_check_strdup(const char *str, const char *filename, long lineno, const char *function)
static int check_endmark(unsigned char *p, size_t size)
static void endmark(unsigned char *p, size_t size)
static void dump_area(struct area *area)
#define FREE_AREA_PATTERN
static void change_total_size(long change)
static struct area * record_allocation(unsigned char *p, size_t size, const char *filename, long lineno, const char *function)
static long check_startmark(unsigned char *p)
int gw_check_is_allocated(void *p)
static struct area free_ring[FREE_RING_SIZE]
#define START_MARK_PATTERN
static long free_ring_len
void gw_check_check_leaks(void)
#define mutex_init_static(mutex)
void * gw_check_claim_area(void *p, const char *filename, long lineno, const char *function)
void warning(int err, const char *fmt,...)
static int check_marks(struct area *area, long index)
static long num_allocations
char filename[FILENAME_MAX+1]
void * gw_check_malloc(size_t size, const char *filename, long lineno, const char *function)
void mutex_destroy(Mutex *mutex)
static unsigned long round_pow2(unsigned long num)
void gw_check_init_mem(int slow_flag)
static void free_area(struct area *area)
struct location reallocator
static int untouched(unsigned char *p, size_t bytes, long pattern)
static long free_ring_start
static long highest_num_allocations
void debug(const char *place, int err, const char *fmt,...)
static struct area allocated[MAX_ALLOCATIONS]
void gw_check_shutdown(void)
static void put_on_free_ring(struct area *area)
struct location allocator
void * gw_check_realloc(void *p, size_t size, const char *filename, long lineno, const char *function)
static long highest_total_size
long gw_check_area_size(void *p)
void gw_check_free(void *p, const char *filename, long lineno, const char *function)
static void remove_allocation(struct area *area)