diff --git a/mongoose.c b/mongoose.c index 37cec3da..fa15b329 100644 --- a/mongoose.c +++ b/mongoose.c @@ -2809,6 +2809,7 @@ void mg_mgr_free(struct mg_mgr *mgr) { struct mg_connection *c; struct mg_timer *tmp, *t = mgr->timers; while (t != NULL) tmp = t->next, free(t), t = tmp; + mgr->timers = NULL; // Important. Next call to poll won't touch timers for (c = mgr->conns; c != NULL; c = c->next) c->is_closing = 1; mg_mgr_poll(mgr, 0); #if MG_ARCH == MG_ARCH_FREERTOS_TCP diff --git a/src/net.c b/src/net.c index 14fde456..d2333cd5 100644 --- a/src/net.c +++ b/src/net.c @@ -230,6 +230,7 @@ void mg_mgr_free(struct mg_mgr *mgr) { struct mg_connection *c; struct mg_timer *tmp, *t = mgr->timers; while (t != NULL) tmp = t->next, free(t), t = tmp; + mgr->timers = NULL; // Important. Next call to poll won't touch timers for (c = mgr->conns; c != NULL; c = c->next) c->is_closing = 1; mg_mgr_poll(mgr, 0); #if MG_ARCH == MG_ARCH_FREERTOS_TCP diff --git a/test/unit_test.c b/test/unit_test.c index 5ab03407..8bb76875 100644 --- a/test/unit_test.c +++ b/test/unit_test.c @@ -1262,6 +1262,15 @@ static void test_timer(void) { mg_timer_free(&head, &t3); ASSERT(head == NULL); + + // Test proper timer deallocation, see #1539 + { + struct mg_mgr mgr; + mg_mgr_init(&mgr); + mg_timer_add(&mgr, 1, MG_TIMER_REPEAT, f1, NULL); + mg_mgr_free(&mgr); + ASSERT(mgr.conns == NULL); + } } static bool sn(const char *fmt, ...) {