Skip to content

Commit 8391ae2

Browse files
authored
Merge pull request #314 from visitorckw/fix-cache-mem
Fix invalid free and memory leak
2 parents 5549d79 + d61dc9b commit 8391ae2

File tree

2 files changed

+15
-18
lines changed

2 files changed

+15
-18
lines changed

src/cache.c

+14-18
Original file line numberDiff line numberDiff line change
@@ -188,40 +188,27 @@ static inline void hlist_del_init(struct hlist_node *n)
188188

189189
cache_t *cache_create(int size_bits)
190190
{
191+
int i;
191192
cache_t *cache = malloc(sizeof(cache_t));
192193
if (!cache)
193194
return NULL;
194195
cache_size_bits = size_bits;
195196
cache_size = 1 << size_bits;
196-
for (int i = 0; i < THRESHOLD; i++) {
197+
for (i = 0; i < THRESHOLD; i++) {
197198
cache->lists[i] = malloc(sizeof(struct list_head));
198199
if (!cache->lists[i]) {
199-
for (int j = 0; j < i; j++) {
200-
free(cache->lists[j]);
201-
}
202-
return NULL;
200+
goto free_lists;
203201
}
204202
INIT_LIST_HEAD(cache->lists[i]);
205203
}
206204

207205
cache->map = malloc(sizeof(hashtable_t));
208206
if (!cache->map) {
209-
for (int i = 0; i < THRESHOLD; i++) {
210-
free(cache->lists[i]);
211-
}
212-
free(cache->lists);
213-
free(cache);
214-
return NULL;
207+
goto free_lists;
215208
}
216209
cache->map->ht_list_head = malloc(cache_size * sizeof(struct hlist_head));
217210
if (!cache->map->ht_list_head) {
218-
free(cache->map);
219-
for (int i = 0; i < THRESHOLD; i++) {
220-
free(cache->lists[i]);
221-
}
222-
free(cache->lists);
223-
free(cache);
224-
return NULL;
211+
goto free_map;
225212
}
226213
for (uint32_t i = 0; i < cache_size; i++) {
227214
INIT_HLIST_HEAD(&cache->map->ht_list_head[i]);
@@ -231,6 +218,15 @@ cache_t *cache_create(int size_bits)
231218
mpool_create(cache_size * sizeof(lfu_entry_t), sizeof(lfu_entry_t));
232219
cache->capacity = cache_size;
233220
return cache;
221+
222+
free_map:
223+
free(cache->map);
224+
free_lists:
225+
for (int j = 0; j < i; j++)
226+
free(cache->lists[i]);
227+
228+
free(cache);
229+
return NULL;
234230
}
235231

236232
void *cache_get(cache_t *cache, uint32_t key)

src/riscv.c

+1
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ riscv_t *rv_create(const riscv_io_t *io,
136136
#else
137137
rv->jit_state = jit_state_init(CODE_CACHE_SIZE);
138138
rv->block_cache = cache_create(BLOCK_MAP_CAPACITY_BITS);
139+
assert(rv->block_cache);
139140
#endif
140141
/* reset */
141142
rv_reset(rv, 0U, argc, args);

0 commit comments

Comments
 (0)