From 878fae8e8a22ea2c34ca544e84e163347835f361 Mon Sep 17 00:00:00 2001 From: Michael Rash Date: Sun, 14 Aug 2011 19:42:50 -0400 Subject: [PATCH] Implemented memory clean up for digest cache list Upon fwknopd shutdown, a new function free_replay_list() is now called in order to free heap allocated memory dedicated to SPA digest tracking. Without this fix, valgrind reports the following (some output snipped): valgrind --leak-check=full ./server/.libs/fwknopd -f -i lo -P "udp port 62201" ==30864== 431 (48 direct, 383 indirect) bytes in 1 blocks are definitely lost in loss record 17 of 17 ==30864== at 0x4C27480: calloc (vg_replace_malloc.c:467) ==30864== by 0x407CB7: replay_check_file_cache (replay_cache.c:461) ==30864== by 0x407B69: replay_check (replay_cache.c:413) ==30864== by 0x405813: incoming_spa (incoming_spa.c:363) ==30864== by 0x406275: pcap_capture (pcap_capture.c:223) ==30864== by 0x40317D: main (fwknopd.c:297) --- server/fwknopd.c | 5 +++++ server/replay_cache.c | 32 ++++++++++++++++++++++++++++++++ server/replay_cache.h | 1 + 3 files changed, 38 insertions(+) diff --git a/server/fwknopd.c b/server/fwknopd.c index 67e41237..3899a081 100644 --- a/server/fwknopd.c +++ b/server/fwknopd.c @@ -366,6 +366,11 @@ main(int argc, char **argv) */ fw_cleanup(); free_logging(); + +#if USE_FILE_CACHE + free_replay_list(&opts); +#endif + free_configs(&opts); return(0); diff --git a/server/replay_cache.c b/server/replay_cache.c index a3801498..7ec06c60 100644 --- a/server/replay_cache.c +++ b/server/replay_cache.c @@ -619,4 +619,36 @@ replay_check_dbm_cache(fko_srv_options_t *opts, fko_ctx_t ctx) } #endif /* USE_FILE_CACHE */ +#if USE_FILE_CACHE +/* Free replay list memory +*/ +void +free_replay_list(fko_srv_options_t *opts) +{ +#ifdef NO_DIGEST_CACHE + return; +#endif + struct digest_cache_list *digest_list_ptr = NULL, *digest_tmp = NULL; + + if (opts->digest_cache == NULL) + return; + + digest_list_ptr = opts->digest_cache; + while (digest_list_ptr != NULL) + { + digest_tmp = digest_list_ptr->next; + if (digest_list_ptr->cache_info.digest != NULL + && digest_list_ptr->cache_info.digest[0] != '\0') + { + free(digest_list_ptr->cache_info.digest); + } + free(digest_list_ptr); + digest_list_ptr = digest_tmp; + } + + return; +} +#endif + + /***EOF***/ diff --git a/server/replay_cache.h b/server/replay_cache.h index f3c6eda1..185d1600 100644 --- a/server/replay_cache.h +++ b/server/replay_cache.h @@ -63,6 +63,7 @@ int replay_check(fko_srv_options_t *opts, fko_ctx_t ctx); #ifdef USE_FILE_CACHE int replay_file_cache_init(fko_srv_options_t *opts); int replay_check_file_cache(fko_srv_options_t *opts, fko_ctx_t ctx); +void free_replay_list(fko_srv_options_t *opts); #else int replay_db_cache_init(fko_srv_options_t *opts); int replay_check_dbm_cache(fko_srv_options_t *opts, fko_ctx_t ctx);