From 81a1c7447c9f565bd57b26be7262631fd240abf9 Mon Sep 17 00:00:00 2001 From: Lorenzo Torres Date: Tue, 20 Aug 2024 13:17:26 +0200 Subject: [PATCH] fix: fixed memory leak on exit --- imap.c | 23 ++++++++++++++++++++++- imap.h | 1 + sis.c | 2 ++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/imap.c b/imap.c index 6eab093..55b4cab 100644 --- a/imap.c +++ b/imap.c @@ -74,6 +74,20 @@ void imap_populate_trie(void) #define CMD_MAP_LAST 0x5 +void imap_trie_free(trie_node *node) +{ + trie_node *tmp = NULL; + + for (int i=0; i < 26; i++) { + tmp = node->children[i]; + if (tmp != NULL) { + imap_trie_free(tmp); + } + } + + free(node); +} + uint8_t imap_init(uint8_t daemon, imap_t *instance) { imap_populate_trie(); @@ -316,14 +330,21 @@ void imap_close(imap_t *instance) client_list *node = instance->clients; client_list *tmp = node; while (node != NULL) { + if (instance->ssl) { + SSL_shutdown(node->ssl); + SSL_free(node->ssl); + } close(node->socket); tmp = node->next; free(node); node = tmp; } + imap_trie_free(trie); close(instance->socket); - SSL_CTX_free(instance->ssl_ctx); + if (instance->ssl) { + SSL_CTX_free(instance->ssl_ctx); + } free(instance); } diff --git a/imap.h b/imap.h index 751ad5e..1bf47c2 100644 --- a/imap.h +++ b/imap.h @@ -94,5 +94,6 @@ void imap_flush(client_list *node, uint8_t ssl); uint8_t imap_cmd_exec(imap_cmd cmd, client_list *node, uint8_t ssl, uint8_t state); void imap_trie_populate(void); void imap_trie_encode(char *str, uint8_t cmd); +void imap_trie_free(trie_node *node); #endif /* ifndef IMAP_H */ diff --git a/sis.c b/sis.c index 08baf9c..ce32dfa 100644 --- a/sis.c +++ b/sis.c @@ -39,6 +39,8 @@ void int_handler(int sig) if (instance != NULL) { imap_close(instance); } + + exit(0); } int main(void)