From 7631531609973fd8067fd5be571b8a4a9f093d26 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Fri, 4 Oct 2013 13:45:22 +0900 Subject: [PATCH] bug fix of malloc/free --- ChangeLog | 6 ++++++ src/main.c | 10 +++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 379bdd2..3055522 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2013-10-04 Niibe Yutaka + + * src/main.c (gnuk_malloc): Update ->neighbor field of a chunk on + the free list. + (gnuk_free): Access free list after getting the lock. + 2013-10-01 Niibe Yutaka * src/random.c (random_gen): Bug fix for INDEXed copy. diff --git a/src/main.c b/src/main.c index b2d6354..755e58a 100644 --- a/src/main.c +++ b/src/main.c @@ -521,6 +521,7 @@ void * gnuk_malloc (size_t size) { struct mem_head *m; + struct mem_head *m0; size = MEMORY_ALIGN (size + sizeof (uint32_t)); @@ -542,6 +543,12 @@ gnuk_malloc (size_t size) if (m->size == size) { remove_from_free_list (m); + m0 = free_list; + while (m0) + if (m0->neighbor == m) + m0->neighbor = NULL; + else + m0 = m0->next; break; } @@ -566,9 +573,10 @@ void gnuk_free (void *p) { struct mem_head *m = (struct mem_head *)((void *)p - sizeof (uint32_t)); - struct mem_head *m0 = free_list; + struct mem_head *m0; chopstx_mutex_lock (&malloc_mtx); + m0 = free_list; DEBUG_INFO ("free: "); DEBUG_SHORT (m->size); DEBUG_WORD ((uint32_t)p);