diff --git a/babeld/babel_zebra.c b/babeld/babel_zebra.c index d8b8919e21..3a7a52ccca 100644 --- a/babeld/babel_zebra.c +++ b/babeld/babel_zebra.c @@ -400,4 +400,5 @@ void babel_zebra_close_connexion(void) { zclient_stop(zclient); + zclient_free(zclient); } diff --git a/eigrpd/eigrpd.c b/eigrpd/eigrpd.c index a0ead05224..2fa8296ce2 100644 --- a/eigrpd/eigrpd.c +++ b/eigrpd/eigrpd.c @@ -267,8 +267,10 @@ eigrp_finish (struct eigrp *eigrp) && (listcount(eigrp_om->eigrp) == 0)) { if (zclient) - zclient_free (zclient); - + { + zclient_stop (zclient); + zclient_free (zclient); + } exit(0); } diff --git a/isisd/isis_main.c b/isisd/isis_main.c index 58070c7f2a..674592f46b 100644 --- a/isisd/isis_main.c +++ b/isisd/isis_main.c @@ -101,6 +101,7 @@ void sigusr1(void); static __attribute__((__noreturn__)) void terminate (int i) { + isis_zebra_stop (); exit (i); } diff --git a/isisd/isis_zebra.c b/isisd/isis_zebra.c index 0009dd5e27..af77250a01 100644 --- a/isisd/isis_zebra.c +++ b/isisd/isis_zebra.c @@ -720,3 +720,10 @@ isis_zebra_init (struct thread_master *master) return; } + +void +isis_zebra_stop (void) +{ + zclient_stop (zclient); + zclient_free (zclient); +} diff --git a/isisd/isis_zebra.h b/isisd/isis_zebra.h index 621c32c363..82d5a48d3e 100644 --- a/isisd/isis_zebra.h +++ b/isisd/isis_zebra.h @@ -25,6 +25,8 @@ extern struct zclient *zclient; void isis_zebra_init(struct thread_master *); +void isis_zebra_stop(void); + void isis_zebra_route_update (struct prefix *prefix, struct isis_route_info *route_info); int isis_distribute_list_update (int routetype); diff --git a/lib/thread.c b/lib/thread.c index bc52d1b134..801168a799 100644 --- a/lib/thread.c +++ b/lib/thread.c @@ -1320,7 +1320,7 @@ thread_fetch (struct thread_master *m, struct thread *fetch) struct timeval now; struct timeval zerotime = { 0, 0 }; struct timeval tv; - struct timeval *tw; + struct timeval *tw = NULL; int num = 0; diff --git a/nhrpd/nhrp_route.c b/nhrpd/nhrp_route.c index 7f8cad6e92..89972f8f98 100644 --- a/nhrpd/nhrp_route.c +++ b/nhrpd/nhrp_route.c @@ -379,6 +379,7 @@ void nhrp_zebra_init(void) void nhrp_zebra_terminate(void) { zclient_stop(zclient); + zclient_free(zclient); route_table_finish(zebra_rib[AFI_IP]); route_table_finish(zebra_rib[AFI_IP6]); } diff --git a/ospf6d/ospf6_main.c b/ospf6d/ospf6_main.c index f69c1e1bca..0a4a3a28c3 100644 --- a/ospf6d/ospf6_main.c +++ b/ospf6d/ospf6_main.c @@ -110,7 +110,10 @@ ospf6_exit (int status) cmd_terminate (); if (zclient) - zclient_free (zclient); + { + zclient_stop (zclient); + zclient_free (zclient); + } if (master) thread_master_free (master); diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c index 38213aeb6a..9af9f7f314 100644 --- a/ospfd/ospfd.c +++ b/ospfd/ospfd.c @@ -497,6 +497,8 @@ ospf_terminate (void) * One or more ospf_finish()'s may have deferred shutdown to a timer * thread */ + zclient_stop (zclient); + zclient_free (zclient); } void diff --git a/pimd/pim_zlookup.c b/pimd/pim_zlookup.c index 779cc14183..e7ffe0f4ad 100644 --- a/pimd/pim_zlookup.c +++ b/pimd/pim_zlookup.c @@ -115,6 +115,7 @@ static void zclient_lookup_failed(struct zclient *zlookup) void zclient_lookup_free (void) { + zclient_stop (zlookup); zclient_free (zlookup); zlookup = NULL; } diff --git a/pimd/pimd.c b/pimd/pimd.c index c31d2a99a1..ec1fe5b6d0 100644 --- a/pimd/pimd.c +++ b/pimd/pimd.c @@ -313,6 +313,8 @@ void pim_init() void pim_terminate() { + struct zclient *zclient; + pim_free(); /* reverse prefix_list_init */ @@ -321,4 +323,11 @@ void pim_terminate() prefix_list_reset (); pim_vrf_terminate (); + + zclient = pim_zebra_zclient_get (); + if (zclient) + { + zclient_stop (zclient); + zclient_free (zclient); + } } diff --git a/ripd/rip_main.c b/ripd/rip_main.c index 38c2875949..1a7d03bca1 100644 --- a/ripd/rip_main.c +++ b/ripd/rip_main.c @@ -100,6 +100,8 @@ sigint (void) if (! retain_mode) rip_clean (); + rip_zclient_stop (); + exit (0); } diff --git a/ripd/rip_zebra.c b/ripd/rip_zebra.c index 337555b0b7..31204872ac 100644 --- a/ripd/rip_zebra.c +++ b/ripd/rip_zebra.c @@ -711,3 +711,10 @@ rip_zclient_init (struct thread_master *master) install_element (RIP_NODE, &rip_default_information_originate_cmd); install_element (RIP_NODE, &no_rip_default_information_originate_cmd); } + +void +rip_zclient_stop (void) +{ + zclient_stop (zclient); + zclient_free (zclient); +} diff --git a/ripd/ripd.h b/ripd/ripd.h index d52df0d992..a8e65d1236 100644 --- a/ripd/ripd.h +++ b/ripd/ripd.h @@ -388,6 +388,7 @@ extern void rip_if_down_all (void); extern void rip_route_map_init (void); extern void rip_route_map_reset (void); extern void rip_zclient_init(struct thread_master *); +extern void rip_zclient_stop(void); extern void rip_zclient_reset (void); extern void rip_offset_init (void); extern int if_check_address (struct in_addr addr); diff --git a/ripngd/ripng_main.c b/ripngd/ripng_main.c index e517817147..9d700305ed 100644 --- a/ripngd/ripng_main.c +++ b/ripngd/ripng_main.c @@ -103,6 +103,7 @@ sigint (void) if (! retain_mode) ripng_clean (); + ripng_zebra_stop (); exit (0); } diff --git a/ripngd/ripng_zebra.c b/ripngd/ripng_zebra.c index 2d62823b11..465d33992f 100644 --- a/ripngd/ripng_zebra.c +++ b/ripngd/ripng_zebra.c @@ -557,3 +557,10 @@ zebra_init (struct thread_master *master) install_element (RIPNG_NODE, &ripng_redistribute_type_metric_routemap_cmd); install_element (RIPNG_NODE, &no_ripng_redistribute_type_cmd); } + +void +ripng_zebra_stop (void) +{ + zclient_stop (zclient); + zclient_free (zclient); +} diff --git a/ripngd/ripngd.h b/ripngd/ripngd.h index 62b7b073f8..ce8ea07a41 100644 --- a/ripngd/ripngd.h +++ b/ripngd/ripngd.h @@ -353,6 +353,7 @@ extern void ripng_route_map_reset (void); extern void ripng_terminate (void); /* zclient_init() is done by ripng_zebra.c:zebra_init() */ extern void zebra_init(struct thread_master *); +extern void ripng_zebra_stop (void); extern void ripng_zclient_reset (void); extern void ripng_offset_init (void);