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