Mercurial > dropbear
comparison dbmalloc.c @ 1361:f9f930e1a516 fuzz
add dbmalloc epoch cleanup
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sun, 21 May 2017 10:54:11 +0800 |
parents | |
children | 9aa6cd66b51d |
comparison
equal
deleted
inserted
replaced
1360:16f45f2df38f | 1361:f9f930e1a516 |
---|---|
1 #include "dbmalloc.h" | |
2 #include "dbutil.h" | |
3 | |
4 #define LIST_SIZE 1000 | |
5 | |
6 struct dbmalloc_header { | |
7 unsigned int index; | |
8 unsigned int epoch; | |
9 }; | |
10 | |
11 static struct dbmalloc_header* dbmalloc_list[LIST_SIZE]; | |
12 | |
13 unsigned int current_epoch = 0; | |
14 | |
15 void m_malloc_set_epoch(unsigned int epoch) { | |
16 current_epoch = epoch; | |
17 } | |
18 | |
19 void m_malloc_free_epoch(unsigned int epoch) { | |
20 unsigned int i; | |
21 unsigned int freed = 0; | |
22 for (i = 0; i < LIST_SIZE; i++) { | |
23 if (dbmalloc_list[i] != NULL) { | |
24 assert(dbmalloc_list[i]->index == i); | |
25 if (dbmalloc_list[i]->epoch == epoch) { | |
26 free(dbmalloc_list[i]); | |
27 dbmalloc_list[i] = NULL; | |
28 freed++; | |
29 } | |
30 } | |
31 } | |
32 TRACE(("free_epoch freed %d", freed)) | |
33 } | |
34 | |
35 static void put_alloc(struct dbmalloc_header *header) { | |
36 unsigned int i; | |
37 for (i = 0; i < LIST_SIZE; i++) { | |
38 if (dbmalloc_list[i] == NULL) { | |
39 dbmalloc_list[i] = header; | |
40 header->index = i; | |
41 return; | |
42 } | |
43 } | |
44 dropbear_exit("ran out of dbmalloc entries"); | |
45 } | |
46 | |
47 static void remove_alloc(struct dbmalloc_header *header) { | |
48 assert(header->index < LIST_SIZE); | |
49 assert(dbmalloc_list[header->index] == header); | |
50 assert(header->epoch == current_epoch); | |
51 dbmalloc_list[header->index] = NULL; | |
52 } | |
53 | |
54 static struct dbmalloc_header* get_header(void* ptr) { | |
55 char* bptr = ptr; | |
56 return (struct dbmalloc_header*)&bptr[-sizeof(struct dbmalloc_header)]; | |
57 } | |
58 | |
59 void * m_malloc(size_t size) { | |
60 char* mem = NULL; | |
61 struct dbmalloc_header* header = NULL; | |
62 | |
63 if (size == 0 || size > 1e9) { | |
64 dropbear_exit("m_malloc failed"); | |
65 } | |
66 | |
67 size = size + sizeof(struct dbmalloc_header); | |
68 | |
69 mem = calloc(1, size); | |
70 if (mem == NULL) { | |
71 dropbear_exit("m_malloc failed"); | |
72 } | |
73 header = (struct dbmalloc_header*)mem; | |
74 put_alloc(header); | |
75 header->epoch = current_epoch; | |
76 return &mem[sizeof(struct dbmalloc_header)]; | |
77 } | |
78 | |
79 void * m_calloc(size_t nmemb, size_t size) { | |
80 assert(nmemb <= 1000 && size <= 10000); | |
81 return m_malloc(nmemb*size); | |
82 } | |
83 | |
84 void * m_realloc(void* ptr, size_t size) { | |
85 char* mem = NULL; | |
86 struct dbmalloc_header* header = NULL; | |
87 if (size == 0 || size > 1e9) { | |
88 dropbear_exit("m_realloc failed"); | |
89 } | |
90 | |
91 header = get_header(ptr); | |
92 remove_alloc(header); | |
93 | |
94 size = size + sizeof(struct dbmalloc_header); | |
95 mem = realloc(header, size); | |
96 if (mem == NULL) { | |
97 dropbear_exit("m_realloc failed"); | |
98 } | |
99 | |
100 header = (struct dbmalloc_header*)mem; | |
101 put_alloc(header); | |
102 return &mem[sizeof(struct dbmalloc_header)]; | |
103 } | |
104 | |
105 void m_free_direct(void* ptr) { | |
106 struct dbmalloc_header* header = NULL; | |
107 if (!ptr) { | |
108 return; | |
109 } | |
110 header = get_header(ptr); | |
111 remove_alloc(header); | |
112 free(header); | |
113 } | |
114 | |
115 void * m_strdup(const char * str) { | |
116 char* ret; | |
117 unsigned int len; | |
118 len = strlen(str); | |
119 | |
120 ret = m_malloc(len+1); | |
121 if (ret == NULL) { | |
122 dropbear_exit("m_strdup failed"); | |
123 } | |
124 memcpy(ret, str, len+1); | |
125 return ret; | |
126 } | |
127 | |
128 |