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)