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 39 : void alloc_counters_reset(void)
16 : {
17 39 : alloc_count=0;
18 39 : free_count=0;
19 39 : }
20 :
21 : static char *errored(const char *func)
22 : {
23 10 : log_oom_w(__func__, func);
24 : return NULL;
25 : }
26 : #endif
27 :
28 502664 : char *strdup_w(const char *s, const char *func)
29 : {
30 : char *ret;
31 : #ifdef UTEST
32 502665 : if(alloc_errors) return errored(func);
33 : #endif
34 502663 : if(!(ret=strdup(s))) log_oom_w(__func__, func);
35 : #ifdef UTEST
36 : else
37 : {
38 502663 : alloc_count++;
39 502663 : if(alloc_debug) printf("%p alloced s\n", ret);
40 : }
41 : #endif
42 : return ret;
43 : }
44 :
45 506042 : void *realloc_w(void *ptr, size_t size, const char *func)
46 : {
47 : void *ret;
48 : #ifdef UTEST
49 506042 : int already_alloced=0;
50 506043 : if(alloc_errors) return errored(func);
51 506041 : if(ptr)
52 : {
53 458166 : already_alloced=1;
54 458166 : if(alloc_debug) printf("%p freed r\n", ptr);
55 : }
56 : #endif
57 506041 : if(!(ret=realloc(ptr, size))) log_oom_w(__func__, func);
58 : #ifdef UTEST
59 506041 : else if(!already_alloced)
60 47875 : alloc_count++;
61 506041 : if(alloc_debug) printf("%p alloced r\n", ret);
62 : #endif
63 : return ret;
64 : }
65 :
66 652819 : void *malloc_w(size_t size, const char *func)
67 : {
68 : void *ret;
69 : #ifdef UTEST
70 652820 : if(alloc_errors) return errored(func);
71 : #endif
72 652818 : if(!(ret=malloc(size))) log_oom_w(__func__, func);
73 : #ifdef UTEST
74 : else
75 : {
76 652818 : alloc_count++;
77 652818 : if(alloc_debug) printf("%p alloced m\n", ret);
78 : }
79 : #endif
80 : return ret;
81 : }
82 :
83 591529 : void *calloc_w(size_t nmem, size_t size, const char *func)
84 : {
85 : void *ret;
86 : #ifdef UTEST
87 591536 : if(alloc_errors) return errored(func);
88 : #endif
89 591522 : if(!(ret=calloc(nmem, size))) log_oom_w(__func__, func);
90 : #ifdef UTEST
91 : else
92 : {
93 591522 : alloc_count++;
94 591522 : if(alloc_debug) printf("%p alloced c\n", ret);
95 : }
96 : #endif
97 : return ret;
98 : }
99 :
100 3305905 : void free_v(void **ptr)
101 : {
102 3305905 : if(!ptr || !*ptr) return;
103 : #ifdef UTEST
104 1794876 : if(alloc_debug) printf("%p freed\n", *ptr);
105 : #endif
106 1794876 : free(*ptr);
107 1794876 : *ptr=NULL;
108 : #ifdef UTEST
109 1794876 : free_count++;
110 : #endif
111 : }
112 :
113 2558680 : void free_w(char **str)
114 : {
115 2558680 : free_v((void **)str);
116 2558680 : }
|