1*c8d645caSAndroid Build Coastguard Worker #include "malloc_wrappers.h" 2*c8d645caSAndroid Build Coastguard Worker #include <stdint.h> 3*c8d645caSAndroid Build Coastguard Worker #include <assert.h> 4*c8d645caSAndroid Build Coastguard Worker #include <string.h> 5*c8d645caSAndroid Build Coastguard Worker 6*c8d645caSAndroid Build Coastguard Worker static size_t alloc_count = 0; 7*c8d645caSAndroid Build Coastguard Worker 8*c8d645caSAndroid Build Coastguard Worker /* Allocate memory and place check values before and after. */ malloc_with_check(size_t size)9*c8d645caSAndroid Build Coastguard Workervoid* malloc_with_check(size_t size) 10*c8d645caSAndroid Build Coastguard Worker { 11*c8d645caSAndroid Build Coastguard Worker size_t size32 = (size + 3) / 4 + 3; 12*c8d645caSAndroid Build Coastguard Worker uint32_t *buf = malloc(size32 * sizeof(uint32_t)); 13*c8d645caSAndroid Build Coastguard Worker buf[0] = size32; 14*c8d645caSAndroid Build Coastguard Worker buf[1] = 0xDEADBEEF; 15*c8d645caSAndroid Build Coastguard Worker buf[size32 - 1] = 0xBADBAD; 16*c8d645caSAndroid Build Coastguard Worker return buf + 2; 17*c8d645caSAndroid Build Coastguard Worker } 18*c8d645caSAndroid Build Coastguard Worker 19*c8d645caSAndroid Build Coastguard Worker /* Free memory allocated with malloc_with_check() and do the checks. */ free_with_check(void * mem)20*c8d645caSAndroid Build Coastguard Workervoid free_with_check(void *mem) 21*c8d645caSAndroid Build Coastguard Worker { 22*c8d645caSAndroid Build Coastguard Worker uint32_t *buf = (uint32_t*)mem - 2; 23*c8d645caSAndroid Build Coastguard Worker assert(buf[1] == 0xDEADBEEF); 24*c8d645caSAndroid Build Coastguard Worker assert(buf[buf[0] - 1] == 0xBADBAD); 25*c8d645caSAndroid Build Coastguard Worker free(buf); 26*c8d645caSAndroid Build Coastguard Worker } 27*c8d645caSAndroid Build Coastguard Worker 28*c8d645caSAndroid Build Coastguard Worker /* Track memory usage */ counting_realloc(void * ptr,size_t size)29*c8d645caSAndroid Build Coastguard Workervoid* counting_realloc(void *ptr, size_t size) 30*c8d645caSAndroid Build Coastguard Worker { 31*c8d645caSAndroid Build Coastguard Worker /* Don't allocate crazy amounts of RAM when fuzzing */ 32*c8d645caSAndroid Build Coastguard Worker if (size > 1000000) 33*c8d645caSAndroid Build Coastguard Worker return NULL; 34*c8d645caSAndroid Build Coastguard Worker 35*c8d645caSAndroid Build Coastguard Worker if (!ptr && size) 36*c8d645caSAndroid Build Coastguard Worker alloc_count++; 37*c8d645caSAndroid Build Coastguard Worker 38*c8d645caSAndroid Build Coastguard Worker return realloc(ptr, size); 39*c8d645caSAndroid Build Coastguard Worker } 40*c8d645caSAndroid Build Coastguard Worker counting_free(void * ptr)41*c8d645caSAndroid Build Coastguard Workervoid counting_free(void *ptr) 42*c8d645caSAndroid Build Coastguard Worker { 43*c8d645caSAndroid Build Coastguard Worker if (ptr) 44*c8d645caSAndroid Build Coastguard Worker { 45*c8d645caSAndroid Build Coastguard Worker assert(alloc_count > 0); 46*c8d645caSAndroid Build Coastguard Worker alloc_count--; 47*c8d645caSAndroid Build Coastguard Worker free(ptr); 48*c8d645caSAndroid Build Coastguard Worker } 49*c8d645caSAndroid Build Coastguard Worker } 50*c8d645caSAndroid Build Coastguard Worker get_alloc_count()51*c8d645caSAndroid Build Coastguard Workersize_t get_alloc_count() 52*c8d645caSAndroid Build Coastguard Worker { 53*c8d645caSAndroid Build Coastguard Worker return alloc_count; 54*c8d645caSAndroid Build Coastguard Worker } 55