]> git.puffer.fish Git - mirror/frr.git/commitdiff
isisd: On shutdown leaking spf_timer thread data
authorDonald Sharp <sharpd@nvidia.com>
Sat, 14 Nov 2020 22:32:01 +0000 (17:32 -0500)
committerDonald Sharp <sharpd@nvidia.com>
Sat, 14 Nov 2020 23:17:27 +0000 (18:17 -0500)
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 <sharpd@nvidia.com>
isisd/isis_spf.c
isisd/isis_spf.h
isisd/isisd.c

index 5480a1b3394fc983f266c386a178af331eaf2f85..19cacde4fe29ca64ac1a42d19da0f544f7d0e2ca 100644 (file)
@@ -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)
 {
index a9a14fc75e581089332f24035e07a743ec347110..ad15d3e3c7fa4afcc5b78bc77caa67db3074cbb6 100644 (file)
@@ -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 */
index 057ede0e38b683a73445787f3b02e2aa9ccfe14a..668b60e385586f1a604609f37425af0da305bc0d 100644 (file)
@@ -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(