summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--babeld/babel_main.c2
-rw-r--r--bgpd/bgp_fsm.c2
-rw-r--r--bgpd/bgp_route.c10
-rw-r--r--bgpd/bgp_routemap.c3
-rw-r--r--eigrpd/eigrp_main.c2
-rw-r--r--isisd/isis_affinitymap.c4
-rw-r--r--isisd/isis_affinitymap.h1
-rw-r--r--isisd/isis_main.c4
-rw-r--r--lib/affinitymap.c9
-rw-r--r--lib/affinitymap.h2
-rw-r--r--ripd/rip_main.c1
-rw-r--r--zebra/main.c2
12 files changed, 40 insertions, 2 deletions
diff --git a/babeld/babel_main.c b/babeld/babel_main.c
index ddc75f7182..77658eb57d 100644
--- a/babeld/babel_main.c
+++ b/babeld/babel_main.c
@@ -19,6 +19,7 @@ Copyright 2011 by Matthieu Boutier and Juliusz Chroboczek
#include "memory.h"
#include "libfrr.h"
#include "lib_errors.h"
+#include "plist.h"
#include "babel_main.h"
#include "babeld.h"
@@ -313,6 +314,7 @@ babel_exit_properly(void)
debugf(BABEL_DEBUG_COMMON, "Done.");
vrf_terminate();
+ prefix_list_reset();
frr_fini();
exit(0);
diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c
index 478f8c9136..940d93a8df 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -1260,7 +1260,7 @@ void bgp_fsm_change_status(struct peer_connection *connection,
/* Transition into Clearing or Deleted must /always/ clear all routes..
* (and must do so before actually changing into Deleted..
*/
- if (status >= Clearing && (peer->established || peer == bgp->peer_self)) {
+ if (status >= Clearing && (peer->established || peer != bgp->peer_self)) {
bgp_clear_route_all(peer);
/* If no route was queued for the clear-node processing,
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 003a9a4d4d..71a1149d10 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -4323,9 +4323,14 @@ static void early_meta_queue_free(struct meta_queue *mq, struct bgp_dest_queue *
struct bgp_dest *dest;
while (!STAILQ_EMPTY(l)) {
+ struct bgp_table *table;
+
dest = STAILQ_FIRST(l);
STAILQ_REMOVE_HEAD(l, pq);
STAILQ_NEXT(dest, pq) = NULL; /* complete unlink */
+
+ table = bgp_dest_table(dest);
+ bgp_table_unlock(table);
mq->size--;
}
}
@@ -4336,9 +4341,14 @@ static void other_meta_queue_free(struct meta_queue *mq, struct bgp_dest_queue *
struct bgp_dest *dest;
while (!STAILQ_EMPTY(l)) {
+ struct bgp_table *table;
+
dest = STAILQ_FIRST(l);
STAILQ_REMOVE_HEAD(l, pq);
STAILQ_NEXT(dest, pq) = NULL; /* complete unlink */
+
+ table = bgp_dest_table(dest);
+ bgp_table_unlock(table);
mq->size--;
}
}
diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c
index c7c8f157ca..15ad921ad0 100644
--- a/bgpd/bgp_routemap.c
+++ b/bgpd/bgp_routemap.c
@@ -2615,6 +2615,9 @@ route_set_aspath_exclude(void *rule, const struct prefix *dummy, void *object)
path->attr->aspath =
aspath_filter_exclude_acl(new_path,
ase->exclude_aspath_acl);
+ else
+ aspath_free(new_path);
+
return RMAP_OKAY;
}
diff --git a/eigrpd/eigrp_main.c b/eigrpd/eigrp_main.c
index 089e18439f..c9ce018966 100644
--- a/eigrpd/eigrp_main.c
+++ b/eigrpd/eigrp_main.c
@@ -99,6 +99,8 @@ static void sigint(void)
keychain_terminate();
route_map_finish();
+ prefix_list_reset();
+
eigrp_terminate();
exit(0);
diff --git a/isisd/isis_affinitymap.c b/isisd/isis_affinitymap.c
index 595091db27..a6b9cf9d4c 100644
--- a/isisd/isis_affinitymap.c
+++ b/isisd/isis_affinitymap.c
@@ -64,4 +64,8 @@ void isis_affinity_map_init(void)
affinity_map_set_update_hook(isis_affinity_map_update);
}
+void isis_affinity_map_terminate(void)
+{
+ affinity_map_terminate();
+}
#endif /* ifndef FABRICD */
diff --git a/isisd/isis_affinitymap.h b/isisd/isis_affinitymap.h
index c432e99f51..525ee0467a 100644
--- a/isisd/isis_affinitymap.h
+++ b/isisd/isis_affinitymap.h
@@ -15,6 +15,7 @@ extern "C" {
#endif
extern void isis_affinity_map_init(void);
+extern void isis_affinity_map_terminate(void);
#ifdef __cplusplus
}
diff --git a/isisd/isis_main.c b/isisd/isis_main.c
index 0d9b3df39c..c36c531a17 100644
--- a/isisd/isis_main.c
+++ b/isisd/isis_main.c
@@ -109,6 +109,10 @@ static __attribute__((__noreturn__)) void terminate(int i)
isis_master_terminate();
route_map_finish();
+ prefix_list_reset();
+#ifndef FABRICD
+ isis_affinity_map_terminate();
+#endif
vrf_terminate();
frr_fini();
diff --git a/lib/affinitymap.c b/lib/affinitymap.c
index 6ff8e83f91..10b339364b 100644
--- a/lib/affinitymap.c
+++ b/lib/affinitymap.c
@@ -127,3 +127,12 @@ void affinity_map_set_update_hook(void (*func)(const char *affmap_name,
{
affinity_map_master.update_hook = func;
}
+
+void affinity_map_terminate(void)
+{
+ struct affinity_map *map;
+ struct listnode *node, *nnode;
+
+ for (ALL_LIST_ELEMENTS(affinity_map_master.maps, node, nnode, map))
+ affinity_map_free(map);
+}
diff --git a/lib/affinitymap.h b/lib/affinitymap.h
index ebe2659bf7..efac1d6423 100644
--- a/lib/affinitymap.h
+++ b/lib/affinitymap.h
@@ -71,7 +71,7 @@ void affinity_map_set_update_hook(void (*func)(const char *affmap_name,
uint16_t new_pos));
void affinity_map_init(void);
-
+void affinity_map_terminate(void);
#ifdef __cplusplus
}
diff --git a/ripd/rip_main.c b/ripd/rip_main.c
index cfe4a7e437..431e967131 100644
--- a/ripd/rip_main.c
+++ b/ripd/rip_main.c
@@ -94,6 +94,7 @@ static void sigint(void)
rip_zclient_stop();
route_map_finish();
+ prefix_list_reset();
keychain_terminate();
frr_fini();
diff --git a/zebra/main.c b/zebra/main.c
index 5c169bb839..af3998e384 100644
--- a/zebra/main.c
+++ b/zebra/main.c
@@ -247,6 +247,8 @@ void zebra_finalize(struct event *dummy)
label_manager_terminate();
+ affinity_map_terminate();
+
ns_walk_func(zebra_ns_final_shutdown, NULL, NULL);
ns_terminate();