]> git.puffer.fish Git - mirror/frr.git/commitdiff
isisd: fix memleak when deleting area and instance
authorIgor Ryzhov <iryzhov@nfware.com>
Sun, 9 May 2021 13:09:38 +0000 (16:09 +0300)
committerIgor Ryzhov <iryzhov@nfware.com>
Fri, 14 May 2021 14:12:36 +0000 (17:12 +0300)
Release memory for all redistributed route info.

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
isisd/isis_redist.c

index ce0f44bf7a8f71265ed86fe2637ca5318fd16c49..2f5e490da1b57abb494287e7eda357e1873a9dcb 100644 (file)
@@ -391,12 +391,19 @@ static void isis_redist_update_zebra_subscriptions(struct isis *isis)
 
 void isis_redist_free(struct isis *isis)
 {
+       struct route_node *rn;
        int i;
 
        for (i = 0; i < REDIST_PROTOCOL_COUNT; i++) {
                if (!isis->ext_info[i])
                        continue;
 
+               for (rn = route_top(isis->ext_info[i]); rn;
+                    rn = srcdest_route_next(rn)) {
+                       if (rn->info)
+                               XFREE(MTYPE_ISIS_EXT_INFO, rn->info);
+               }
+
                route_table_finish(isis->ext_info[i]);
                isis->ext_info[i] = NULL;
        }
@@ -504,6 +511,7 @@ void isis_redist_unset(struct isis_area *area, int level, int family, int type)
 
 void isis_redist_area_finish(struct isis_area *area)
 {
+       struct route_node *rn;
        int protocol;
        int level;
        int type;
@@ -518,7 +526,15 @@ void isis_redist_area_finish(struct isis_area *area)
                                redist->redist = 0;
                                XFREE(MTYPE_ISIS_RMAP_NAME, redist->map_name);
                        }
+                       if (!area->ext_reach[protocol][level])
+                               continue;
+                       for (rn = route_top(area->ext_reach[protocol][level]);
+                            rn; rn = srcdest_route_next(rn)) {
+                               if (rn->info)
+                                       XFREE(MTYPE_ISIS_EXT_INFO, rn->info);
+                       }
                        route_table_finish(area->ext_reach[protocol][level]);
+                       area->ext_reach[protocol][level] = NULL;
                }
 
        isis_redist_update_zebra_subscriptions(area->isis);