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