Line data Source code
1 : #include "burp.h" 2 : #include "alloc.h" 3 : #include "log.h" 4 : 5 : #ifdef UTEST 6 : int alloc_debug=0; 7 : /* 8 : To use alloc_debug: 9 : CK_FORK=no ./runner > /tmp/out 10 : grep freed /tmp/out | cut -f 1 -d ' ' | sort > /tmp/freed && grep alloced /tmp/out | cut -f 1 -d ' ' | sort > /tmp/alloced && diff -u /tmp/alloced /tmp/freed 11 : */ 12 : int alloc_errors=0; 13 : uint64_t alloc_count=0; 14 : uint64_t free_count=0; 15 42 : void alloc_counters_reset(void) 16 : { 17 42 : alloc_count=0; 18 42 : free_count=0; 19 42 : } 20 : 21 3 : static char *errored(const char *func) 22 : { 23 3 : log_oom_w(__func__, func); 24 3 : return NULL; 25 : } 26 : #endif 27 : 28 90984 : char *strdup_w(const char *s, const char *func) 29 : { 30 90984 : char *ret; 31 : #ifdef UTEST 32 90984 : if(alloc_errors) return errored(func); 33 : #endif 34 90983 : if(!(ret=strdup(s))) log_oom_w(__func__, func); 35 : #ifdef UTEST 36 : else 37 : { 38 90983 : alloc_count++; 39 90983 : if(alloc_debug) printf("%p alloced s\n", ret); 40 : } 41 : #endif 42 : return ret; 43 : } 44 : 45 51977 : void *realloc_w(void *ptr, size_t size, const char *func) 46 : { 47 51977 : void *ret; 48 : #ifdef UTEST 49 51977 : int already_alloced=0; 50 51977 : if(alloc_errors) return errored(func); 51 51977 : if(ptr) 52 : { 53 45192 : already_alloced=1; 54 45192 : if(alloc_debug) printf("%p freed r\n", ptr); 55 : } 56 : #endif 57 51977 : if(!(ret=realloc(ptr, size))) log_oom_w(__func__, func); 58 : #ifdef UTEST 59 51977 : else if(!already_alloced) 60 6785 : alloc_count++; 61 51977 : if(alloc_debug) printf("%p alloced r\n", ret); 62 : #endif 63 : return ret; 64 : } 65 : 66 92917 : void *malloc_w(size_t size, const char *func) 67 : { 68 92917 : void *ret; 69 : #ifdef UTEST 70 92917 : if(alloc_errors) return errored(func); 71 : #endif 72 92917 : if(!(ret=malloc(size))) log_oom_w(__func__, func); 73 : #ifdef UTEST 74 : else 75 : { 76 92917 : alloc_count++; 77 92917 : if(alloc_debug) printf("%p alloced m\n", ret); 78 : } 79 : #endif 80 : return ret; 81 : } 82 : 83 100006 : void *calloc_w(size_t nmem, size_t size, const char *func) 84 : { 85 100006 : void *ret; 86 : #ifdef UTEST 87 100006 : if(alloc_errors) return errored(func); 88 : #endif 89 100004 : if(!(ret=calloc(nmem, size))) log_oom_w(__func__, func); 90 : #ifdef UTEST 91 : else 92 : { 93 100004 : alloc_count++; 94 100004 : if(alloc_debug) printf("%p alloced c\n", ret); 95 : } 96 : #endif 97 : return ret; 98 : } 99 : 100 641567 : void free_v(void **ptr) 101 : { 102 641567 : if(!ptr || !*ptr) return; 103 : #ifdef UTEST 104 290687 : if(alloc_debug) printf("%p freed\n", *ptr); 105 : #endif 106 290687 : free(*ptr); 107 290687 : *ptr=NULL; 108 : #ifdef UTEST 109 290687 : free_count++; 110 : #endif 111 : } 112 : 113 537431 : void free_w(char **str) 114 : { 115 537431 : free_v((void **)str); 116 537431 : }