]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra/lib: plug several memleaks
authorRenato Westphal <renato@opensourcerouting.org>
Tue, 1 Nov 2016 20:57:53 +0000 (18:57 -0200)
committerRenato Westphal <renato@opensourcerouting.org>
Mon, 28 Nov 2016 18:15:27 +0000 (16:15 -0200)
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
lib/command.c
lib/qobj.c
lib/table.c
lib/table.h
zebra/interface.c
zebra/main.c
zebra/zebra_memory.h
zebra/zebra_mpls.c
zebra/zebra_ns.c
zebra/zebra_ns.h
zebra/zebra_ptm.c

index e8ba63762300d677e58ac594b64c6252e24b696c..acfcf685760757ee0f9d93a3dd7ca2011bd8d8e4 100644 (file)
@@ -4436,4 +4436,6 @@ cmd_terminate ()
     XFREE (MTYPE_HOST, host.motdfile);
   if (host.config)
     XFREE (MTYPE_HOST, host.config);
+
+  qobj_finish ();
 }
index 65b537f961685dd1b036009ea0474f6d1afb1337..f64972e32aa3569ec6795cd96af6338d2019ba06 100644 (file)
@@ -78,6 +78,7 @@ void qobj_init (void)
 
 void qobj_finish (void)
 {
+  hash_clean (nodes, NULL);
   hash_free (nodes);
   nodes = NULL;
 }
index d0e084ead2abf3417bf0138c8ef2631b2dc79e15..5133ef6974fddab7e6132111aa2c2ac0a0a3bece 100644 (file)
@@ -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)
 {
index e6cdcfef1ebdd2a9aaf54c257b7056460ebcebbb..78bf5da748726650f298c398ea7c2d4e364fe482 100644 (file)
@@ -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
index b87f61f920f53751e5c23f0427710c00a785bba0..422368852d1ce40b38b373a16e08677b30261bb6 100644 (file)
@@ -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;
 
index 9247d435071213336c68867d5f4245105280afa4..1b41f8deffd318da50842dcb489552e3905ee0e4 100644 (file)
@@ -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);
 }
 
index fbd8f3261df62b16d79589faf7fc83a7b0b0623a..c1ac4fe95509ff99f68ff1ec70e95ff5bbe51f9c 100644 (file)
@@ -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 */
index 15e5c330e48ab253028c8d2895bdea188e63aa75..b64cab625d806b0b5ad966d038b6ba0cc32c57f1 100644 (file)
@@ -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);
 }
 
 /*
index 41034e19801d5166bedfa50330b1c6610a196b9c..4499901021115e411a52f98373ce71da8c92867a 100644 (file)
@@ -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
index 8a821c465a126dec015ccb8b08d84ddadeb1a3f3..c50f9249d2fc344b0a6ef6eb9aed72e317590a91 100644 (file)
@@ -32,7 +32,7 @@ struct nlsock
   int sock;
   int seq;
   struct sockaddr_nl snl;
-  const char *name;
+  char name[64];
 };
 #endif
 
index ebae1bd4b93ce454561eb1a5d96bcdf2c2fd1405..28e6c42ec6b38ca277b13ac47d4c03596acbf9f6 100644 (file)
@@ -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);