From 2abdba9e8a019dff21bdaee64a58ff5bfbadb6eb Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 14 Oct 2015 14:08:50 +0200 Subject: [PATCH] refactor free_messagelist, fix leak in test_merge_split --- src/kernel/faction.c | 12 ++++++++---- src/kernel/messages.c | 15 ++++++--------- src/kernel/messages.h | 2 +- src/kernel/messages.test.c | 9 ++++++--- src/kernel/region.c | 9 ++++++--- src/tests.c | 7 +++++-- 6 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/kernel/faction.c b/src/kernel/faction.c index 193a582ae..636619310 100755 --- a/src/kernel/faction.c +++ b/src/kernel/faction.c @@ -69,13 +69,17 @@ faction *factions; void free_faction(faction * f) { funhash(f); - if (f->msgs) - free_messagelist(f->msgs); + if (f->msgs) { + free_messagelist(f->msgs->begin); + free(f->msgs); + } while (f->battles) { struct bmsg *bm = f->battles; f->battles = bm->next; - if (bm->msgs) - free_messagelist(bm->msgs); + if (bm->msgs) { + free_messagelist(bm->msgs->begin); + free(bm->msgs); + } free(bm); } diff --git a/src/kernel/messages.c b/src/kernel/messages.c index ea45bc835..77b15ea23 100644 --- a/src/kernel/messages.c +++ b/src/kernel/messages.c @@ -283,17 +283,14 @@ void syntax_error(const struct unit *u, struct order *ord) extern unsigned int new_hashstring(const char *s); -void free_messagelist(message_list * msgs) +void free_messagelist(mlist *msgs) { struct mlist **mlistptr; - if (msgs) { - for (mlistptr = &msgs->begin; *mlistptr;) { - struct mlist *ml = *mlistptr; - *mlistptr = ml->next; - msg_release(ml->msg); - free(ml); - } - free(msgs); + for (mlistptr = &msgs; *mlistptr;) { + struct mlist *ml = *mlistptr; + *mlistptr = ml->next; + msg_release(ml->msg); + free(ml); } } diff --git a/src/kernel/messages.h b/src/kernel/messages.h index 6891de586..866eecba7 100644 --- a/src/kernel/messages.h +++ b/src/kernel/messages.h @@ -37,7 +37,7 @@ extern "C" { struct mlist *begin, **end; } message_list; - void free_messagelist(message_list * msgs); + void free_messagelist(struct mlist *msgs); typedef struct msglevel { /* used to set specialized msg-levels */ diff --git a/src/kernel/messages.test.c b/src/kernel/messages.test.c index af95ecf26..e18dd54e8 100644 --- a/src/kernel/messages.test.c +++ b/src/kernel/messages.test.c @@ -39,7 +39,7 @@ void test_message(CuTest *tc) { static void test_merge_split(CuTest *tc) { message_list *mlist = 0, *append = 0; - struct mlist **split; + struct mlist **split; // TODO: why is this a double asterisk? message_type *mtype = mt_new("custom", NULL); test_cleanup(); @@ -57,8 +57,11 @@ static void test_merge_split(CuTest *tc) { CuAssertPtrEquals(tc, append->begin, mlist->begin->next); split_messages(mlist, split); CuAssertPtrEquals(tc, 0, mlist->begin->next); - free_messagelist(mlist); - free_messagelist(append); + free_messagelist(*split); + free_messagelist(mlist->begin); + free(mlist); + free_messagelist(append->begin); + free(append); test_cleanup(); } diff --git a/src/kernel/region.c b/src/kernel/region.c index dd83af4e6..4b57b9e51 100644 --- a/src/kernel/region.c +++ b/src/kernel/region.c @@ -820,15 +820,18 @@ void free_region(region * r) freeland(r->land); if (r->msgs) { - free_messagelist(r->msgs); + free_messagelist(r->msgs->begin); + free(r->msgs); r->msgs = 0; } while (r->individual_messages) { struct individual_message *msg = r->individual_messages; r->individual_messages = msg->next; - if (msg->msgs) - free_messagelist(msg->msgs); + if (msg->msgs) { + free_messagelist(msg->msgs->begin); + free(msg->msgs); + } free(msg); } diff --git a/src/tests.c b/src/tests.c index 6e9ec31a8..00188edca 100644 --- a/src/tests.c +++ b/src/tests.c @@ -286,8 +286,11 @@ struct message * test_find_messagetype(struct message_list *msgs, const char *na } void test_clear_messages(faction *f) { - free_messagelist(f->msgs); - f->msgs = 0; + if (f->msgs) { + free_messagelist(f->msgs->begin); + free(f->msgs); + f->msgs = 0; + } } void disabled_test(void *suite, void (*test)(CuTest *), const char *name) {