From 749ebb4f380d0ab43ca44464ed35c5c5f9074f51 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 | 2 ++ isisd/isisd.c | 7 +++++++ 3 files changed, 14 insertions(+) diff --git a/isisd/isis_spf.c b/isisd/isis_spf.c index dd0a6ec824..dd563cbbbe 100644 --- a/isisd/isis_spf.c +++ b/isisd/isis_spf.c @@ -1437,6 +1437,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 b2dc23496f..b1a9054a84 100644 --- a/isisd/isis_spf.h +++ b/isisd/isis_spf.h @@ -69,4 +69,6 @@ void isis_run_spf(struct isis_spftree *spftree); 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 e33fae4231..896be0bf36 100644 --- a/isisd/isisd.c +++ b/isisd/isisd.c @@ -440,7 +440,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_TIMER_OFF(area->spf_timer[0]); + if (area->spf_timer[1]) + isis_spf_timer_free(THREAD_ARG(area->spf_timer[1])); THREAD_TIMER_OFF(area->spf_timer[1]); spf_backoff_free(area->spf_delay_ietf[0]); @@ -2311,6 +2315,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_TIMER_OFF(area->spf_timer[level - 1]); sched_debug( -- 2.39.5