From 8f15843bba7b0e0fef6479a4447ee333be3ea9e8 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Sat, 14 Nov 2020 17:32:01 -0500 Subject: [PATCH] isisd: On shutdown leaking spf_timer thread data When isis is being shutdown the area->spf_timer thread has special data assigned to that was never being freed. Free this data. Signed-off-by: Donald Sharp --- isisd/isis_spf.c | 5 +++++ isisd/isis_spf.h | 1 + isisd/isisd.c | 7 +++++++ 3 files changed, 13 insertions(+) diff --git a/isisd/isis_spf.c b/isisd/isis_spf.c index 5480a1b339..19cacde4fe 100644 --- a/isisd/isis_spf.c +++ b/isisd/isis_spf.c @@ -1727,6 +1727,11 @@ static struct isis_spf_run *isis_run_spf_arg(struct isis_area *area, int level) return run; } +void isis_spf_timer_free(void *run) +{ + XFREE(MTYPE_ISIS_SPF_RUN, run); +} + int _isis_spf_schedule(struct isis_area *area, int level, const char *func, const char *file, int line) { diff --git a/isisd/isis_spf.h b/isisd/isis_spf.h index a9a14fc75e..ad15d3e3c7 100644 --- a/isisd/isis_spf.h +++ b/isisd/isis_spf.h @@ -78,4 +78,5 @@ struct isis_spftree *isis_run_hopcount_spf(struct isis_area *area, uint8_t *sysid, struct isis_spftree *spftree); +void isis_spf_timer_free(void *run); #endif /* _ZEBRA_ISIS_SPF_H */ diff --git a/isisd/isisd.c b/isisd/isisd.c index 057ede0e38..668b60e385 100644 --- a/isisd/isisd.c +++ b/isisd/isisd.c @@ -442,7 +442,11 @@ void isis_area_destroy(struct isis_area *area) spftree_area_del(area); + if (area->spf_timer[0]) + isis_spf_timer_free(THREAD_ARG(area->spf_timer[0])); thread_cancel(&area->spf_timer[0]); + if (area->spf_timer[1]) + isis_spf_timer_free(THREAD_ARG(area->spf_timer[1])); thread_cancel(&area->spf_timer[1]); spf_backoff_free(area->spf_delay_ietf[0]); @@ -2375,6 +2379,9 @@ static void area_resign_level(struct isis_area *area, int level) } } + if (area->spf_timer[level - 1]) + isis_spf_timer_free(THREAD_ARG(area->spf_timer[level - 1])); + thread_cancel(&area->spf_timer[level - 1]); sched_debug( -- 2.39.5