From 58ac32e2d598b5dc45fa05b7a8a85b107571d697 Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Tue, 1 Nov 2016 18:57:53 -0200 Subject: [PATCH] zebra/lib: plug several memleaks Signed-off-by: Renato Westphal --- lib/command.c | 2 ++ lib/qobj.c | 1 + lib/table.c | 4 ++-- lib/table.h | 5 +++++ zebra/interface.c | 16 +++++++++++++++- zebra/main.c | 12 ++++++++++++ zebra/zebra_memory.h | 1 - zebra/zebra_mpls.c | 10 ++++++---- zebra/zebra_ns.c | 13 +++++-------- zebra/zebra_ns.h | 2 +- zebra/zebra_ptm.c | 2 ++ 11 files changed, 51 insertions(+), 17 deletions(-) diff --git a/lib/command.c b/lib/command.c index e8ba637623..acfcf68576 100644 --- a/lib/command.c +++ b/lib/command.c @@ -4436,4 +4436,6 @@ cmd_terminate () XFREE (MTYPE_HOST, host.motdfile); if (host.config) XFREE (MTYPE_HOST, host.config); + + qobj_finish (); } diff --git a/lib/qobj.c b/lib/qobj.c index 65b537f961..f64972e32a 100644 --- a/lib/qobj.c +++ b/lib/qobj.c @@ -78,6 +78,7 @@ void qobj_init (void) void qobj_finish (void) { + hash_clean (nodes, NULL); hash_free (nodes); nodes = NULL; } diff --git a/lib/table.c b/lib/table.c index d0e084ead2..5133ef6974 100644 --- a/lib/table.c +++ b/lib/table.c @@ -494,7 +494,7 @@ route_table_count (const struct route_table *table) * * Default function for creating a route node. */ -static struct route_node * +struct route_node * route_node_create (route_table_delegate_t *delegate, struct route_table *table) { @@ -508,7 +508,7 @@ route_node_create (route_table_delegate_t *delegate, * * Default function for destroying a route node. */ -static void +void route_node_destroy (route_table_delegate_t *delegate, struct route_table *table, struct route_node *node) { diff --git a/lib/table.h b/lib/table.h index e6cdcfef1e..78bf5da748 100644 --- a/lib/table.h +++ b/lib/table.h @@ -169,6 +169,11 @@ extern struct route_node *route_node_match_ipv6 (const struct route_table *, extern unsigned long route_table_count (const struct route_table *); +extern struct route_node *route_node_create (route_table_delegate_t *, + struct route_table *); +extern void route_node_destroy (route_table_delegate_t *, + struct route_table *, struct route_node *); + extern struct route_node * route_table_get_next (const struct route_table *table, struct prefix *p); extern int diff --git a/zebra/interface.c b/zebra/interface.c index b87f61f920..422368852d 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -59,6 +59,20 @@ const char *rtadv_pref_strs[] = { "medium", "high", "INVALID", "low", 0 }; static void if_down_del_nbr_connected (struct interface *ifp); +static void +zebra_if_node_destroy (route_table_delegate_t *delegate, + struct route_table *table, struct route_node *node) +{ + if (node->info) + list_delete (node->info); + route_node_destroy (delegate, table, node); +} + +route_table_delegate_t zebra_if_table_delegate = { + .create_node = route_node_create, + .destroy_node = zebra_if_node_destroy +}; + /* Called when new interface is added. */ static int if_zebra_new_hook (struct interface *ifp) @@ -101,7 +115,7 @@ if_zebra_new_hook (struct interface *ifp) #endif /* HAVE_RTADV */ /* Initialize installed address chains tree. */ - zebra_if->ipv4_subnets = route_table_init (); + zebra_if->ipv4_subnets = route_table_init_with_delegate (&zebra_if_table_delegate); ifp->info = zebra_if; diff --git a/zebra/main.c b/zebra/main.c index 9247d43507..1b41f8deff 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -196,6 +196,18 @@ sigint (void) zns = zebra_ns_lookup (NS_DEFAULT); zebra_ns_disable (0, (void **)&zns); + + access_list_reset (); + prefix_list_reset (); + route_map_finish (); + cmd_terminate (); + vty_terminate (); + zprivs_terminate (&zserv_privs); + list_delete (zebrad.client_list); + thread_master_free (zebrad.master); + if (zlog_default) + closezlog (zlog_default); + exit (0); } diff --git a/zebra/zebra_memory.h b/zebra/zebra_memory.h index fbd8f3261d..c1ac4fe955 100644 --- a/zebra/zebra_memory.h +++ b/zebra/zebra_memory.h @@ -35,6 +35,5 @@ DECLARE_MTYPE(STATIC_ROUTE) DECLARE_MTYPE(RIB_DEST) DECLARE_MTYPE(RIB_TABLE_INFO) DECLARE_MTYPE(RNH) -DECLARE_MTYPE(NETLINK_NAME) #endif /* _QUAGGA_ZEBRA_MEMORY_H */ diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c index 15e5c330e4..b64cab625d 100644 --- a/zebra/zebra_mpls.c +++ b/zebra/zebra_mpls.c @@ -1829,7 +1829,7 @@ zebra_mpls_print_lsp_table (struct vty *vty, struct zebra_vrf *zvrf, vty_out (vty, "%s", VTY_NEWLINE); } - list_delete_all_node(lsp_list); + list_delete (lsp_list); } /* @@ -1869,7 +1869,7 @@ zebra_mpls_write_lsp_config (struct vty *vty, struct zebra_vrf *zvrf) } } - list_delete_all_node(slsp_list); + list_delete (slsp_list); return (zvrf->slsp_table->count ? 1 : 0); } @@ -1881,9 +1881,11 @@ zebra_mpls_write_lsp_config (struct vty *vty, struct zebra_vrf *zvrf) void zebra_mpls_close_tables (struct zebra_vrf *zvrf) { - if (!zvrf) - return; hash_iterate(zvrf->lsp_table, lsp_uninstall_from_kernel, NULL); + hash_clean(zvrf->lsp_table, NULL); + hash_free(zvrf->lsp_table); + hash_clean(zvrf->slsp_table, NULL); + hash_free(zvrf->slsp_table); } /* diff --git a/zebra/zebra_ns.c b/zebra/zebra_ns.c index 41034e1980..4499901021 100644 --- a/zebra/zebra_ns.c +++ b/zebra/zebra_ns.c @@ -32,7 +32,6 @@ #include "zebra_memory.h" DEFINE_MTYPE(ZEBRA, ZEBRA_NS, "Zebra Name Space") -DEFINE_MTYPE(ZEBRA, NETLINK_NAME, "Netlink name") struct zebra_ns *dzns; @@ -46,9 +45,6 @@ int zebra_ns_enable (ns_id_t ns_id, void **info) { struct zebra_ns *zns = (struct zebra_ns *) (*info); -#ifdef HAVE_NETLINK - char nl_name[64]; -#endif #if defined (HAVE_RTADV) rtadv_init (zns); @@ -56,13 +52,13 @@ zebra_ns_enable (ns_id_t ns_id, void **info) #ifdef HAVE_NETLINK /* Initialize netlink sockets */ - snprintf (nl_name, 64, "netlink-listen (NS %u)", ns_id); + snprintf (zns->netlink.name, sizeof (zns->netlink.name), + "netlink-listen (NS %u)", ns_id); zns->netlink.sock = -1; - zns->netlink.name = XSTRDUP (MTYPE_NETLINK_NAME, nl_name); - snprintf (nl_name, 64, "netlink-cmd (NS %u)", ns_id); + snprintf (zns->netlink_cmd.name, sizeof (zns->netlink_cmd.name), + "netlink-cmd (NS %u)", ns_id); zns->netlink_cmd.sock = -1; - zns->netlink_cmd.name = XSTRDUP (MTYPE_NETLINK_NAME, nl_name); #endif zns->if_table = route_table_init (); kernel_init (zns); @@ -77,6 +73,7 @@ zebra_ns_disable (ns_id_t ns_id, void **info) { struct zebra_ns *zns = (struct zebra_ns *) (*info); + route_table_finish (zns->if_table); #if defined (HAVE_RTADV) rtadv_terminate (zns); #endif diff --git a/zebra/zebra_ns.h b/zebra/zebra_ns.h index 8a821c465a..c50f9249d2 100644 --- a/zebra/zebra_ns.h +++ b/zebra/zebra_ns.h @@ -32,7 +32,7 @@ struct nlsock int sock; int seq; struct sockaddr_nl snl; - const char *name; + char name[64]; }; #endif diff --git a/zebra/zebra_ptm.c b/zebra/zebra_ptm.c index ebae1bd4b9..28e6c42ec6 100644 --- a/zebra/zebra_ptm.c +++ b/zebra/zebra_ptm.c @@ -140,6 +140,8 @@ zebra_ptm_finish(void) buffer_flush_all(ptm_cb.wb, ptm_cb.ptm_sock); + free (ptm_hdl); + if (ptm_cb.out_data) free(ptm_cb.out_data); -- 2.39.5