FIX: memory leak in MID insert
authorHenning Rogge <hrogge@googlemail.com>
Sun, 13 Dec 2009 13:58:28 +0000 (14:58 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Sun, 13 Dec 2009 13:58:28 +0000 (14:58 +0100)
Cleanup memory handling a little bit (I won't touch the flex/bison hell)

lib/httpinfo/src/olsrd_httpinfo.c
src/interfaces.h
src/linux/kernel_routes.c
src/main.c
src/mid_set.c
src/mid_set.h
src/parser.c
src/parser.h
src/scheduler.c
src/tc_set.c
src/tc_set.h

index 8526d17..196d866 100644 (file)
@@ -673,9 +673,16 @@ build_tabs(struct autobuf *abuf, int active)
 void
 olsr_plugin_exit(void)
 {
+  struct allowed_net *a, *next;
   if (http_socket >= 0) {
     CLOSE(http_socket);
   }
+
+  for (a = allowed_nets; a != NULL; a = next) {
+    next = a->next;
+
+    free(a);
+  }
 }
 
 static void
index b0e638d..3bb8082 100644 (file)
@@ -187,6 +187,7 @@ struct interface {
 extern struct interface *ifnet;
 
 int ifinit(void);
+void olsr_delete_interfaces(void);
 
 void run_ifchg_cbs(struct interface *, int);
 
index 79b6390..eaa74ed 100644 (file)
@@ -84,6 +84,8 @@ int rtnetlink_register_socket(int rtnl_mgrp)
     OLSR_PRINTF(1,"could not create rtnetlink socket! %d",sock);
   }
   else {
+    memset(&addr, 0, sizeof(addr));
+
     addr.nl_family = AF_NETLINK;
     addr.nl_pid = 0; //kernel will assign appropiate number instead of pid (which is already used by primaray rtnetlink socket to add/delete routes)
     addr.nl_groups = rtnl_mgrp;
index 245f43b..d77461e 100644 (file)
@@ -57,6 +57,7 @@
 #include "net_os.h"
 #include "build_msg.h"
 #include "net_olsr.h"
+#include "mid_set.h"
 
 #if LINUX_POLICY_ROUTING
 #include <linux/types.h>
@@ -533,6 +534,7 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
 #endif
 {
   struct interface *ifn;
+  int exit_value;
 
   OLSR_PRINTF(1, "Received signal %d - shutting down\n", (int)signo);
 
@@ -549,6 +551,12 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
 
   olsr_delete_all_kernel_routes();
 
+  olsr_delete_all_tc_entries();
+
+  olsr_delete_all_mid_entries();
+
+  olsr_destroy_parser();
+
   OLSR_PRINTF(1, "Closing sockets...\n");
 
   /* front-end IPC socket */
@@ -556,7 +564,6 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
     shutdown_ipc();
   }
 
-  /* OLSR sockets */
   for (ifn = ifnet; ifn; ifn = ifn->int_next)
     close(ifn->olsr_socket);
 
@@ -584,13 +591,17 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
 #endif
 
   /* Free cookies and memory pools attached. */
+  OLSR_PRINTF(0, "Free all memory...\n");
   olsr_delete_all_cookies();
 
   olsr_syslog(OLSR_LOG_INFO, "%s stopped", olsrd_version);
 
   OLSR_PRINTF(1, "\n <<<< %s - terminating >>>>\n           http://www.olsr.org\n", olsrd_version);
 
-  exit(olsr_cnf->exit_value);
+  exit_value = olsr_cnf->exit_value;
+  free (olsr_cnf);
+
+  exit(exit_value);
 }
 
 /**
index 202891f..761ee4a 100644 (file)
@@ -38,6 +38,7 @@
  * the copyright holders.
  *
  */
+#include <assert.h>
 
 #include "ipcalc.h"
 #include "defs.h"
@@ -79,6 +80,15 @@ olsr_init_mid_set(void)
   return 1;
 }
 
+void olsr_delete_all_mid_entries(void) {
+  int hash;
+
+  for (hash = 0; hash < HASHSIZE; hash++) {
+    while (mid_set[hash].next != &mid_set[hash]) {
+      olsr_delete_mid_entry(mid_set[hash].next);
+    }
+  }
+}
 /**
  * Wrapper for the timer callback.
  */
@@ -124,10 +134,10 @@ olsr_set_mid_timer(struct mid_entry *mid, olsr_reltime rel_timer)
  *
  * @param m_addr the main address of the node
  * @param alias the alias address to insert
- * @return nada
+ * @return false if mid_address is unnecessary, true otherwise
  */
 
-void
+static bool
 insert_mid_tuple(union olsr_ip_addr *m_addr, struct mid_address *alias, olsr_reltime vtime)
 {
   struct mid_entry *tmp;
@@ -147,9 +157,8 @@ insert_mid_tuple(union olsr_ip_addr *m_addr, struct mid_address *alias, olsr_rel
   /* Check if alias is already registered with m_addr */
   registered_m_addr = mid_lookup_main_addr(&alias->alias);
   if (registered_m_addr != NULL && ipequal(registered_m_addr, m_addr)) {
-
     /* Alias is already registered with main address. Nothing to do here. */
-    return;
+    return false;
   }
 
   /*
@@ -223,6 +232,7 @@ insert_mid_tuple(union olsr_ip_addr *m_addr, struct mid_address *alias, olsr_rel
     }
     tmp_adr = tmp_adr->next_alias;
   }
+  return true;
 }
 
 /**
@@ -284,7 +294,9 @@ insert_mid_alias(union olsr_ip_addr *main_add, const union olsr_ip_addr *alias,
     }
   }
 
-  insert_mid_tuple(main_add, adr, vtime);
+  if (!insert_mid_tuple(main_add, adr, vtime)) {
+    free(adr);
+  }
 
   /*
    *Recalculate topology
index a7809ad..37842dd 100644 (file)
@@ -75,7 +75,7 @@ extern struct mid_address reverse_mid_set[HASHSIZE];
 struct mid_alias;
 
 int olsr_init_mid_set(void);
-void insert_mid_tuple(union olsr_ip_addr *, struct mid_address *, olsr_reltime);
+void olsr_delete_all_mid_entries(void);
 void insert_mid_alias(union olsr_ip_addr *, const union olsr_ip_addr *, olsr_reltime);
 union olsr_ip_addr *mid_lookup_main_addr(const union olsr_ip_addr *);
 struct mid_address *mid_lookup_aliases(const union olsr_ip_addr *);
index bc00dd9..97f1fde 100644 (file)
@@ -102,6 +102,26 @@ olsr_init_parser(void)
 
 }
 
+void
+olsr_destroy_parser(void) {
+  struct parse_function_entry *pe, *pe_next;
+  struct preprocessor_function_entry *ppe, *ppe_next;
+  struct packetparser_function_entry *pae, *pae_next;
+
+  for (pe = parse_functions; pe; pe = pe_next) {
+    pe_next = pe->next;
+    free (pe);
+  }
+  for (ppe = preprocessor_functions; ppe; ppe = ppe_next) {
+    ppe_next = ppe->next;
+    free (ppe);
+  }
+  for (pae = packetparser_functions; pae; pae = pae_next) {
+    pae_next = pae->next;
+    free(pae);
+  }
+}
+
 void
 olsr_parser_add_function(parse_function * function, uint32_t type)
 {
index ca16941..99d50ed 100644 (file)
@@ -74,6 +74,8 @@ void parser_set_disp_pack_in(bool);
 
 void olsr_init_parser(void);
 
+void olsr_destroy_parser(void);
+
 void olsr_input(int);
 
 void olsr_input_hostemu(int);
index 04cee21..6f6c26c 100644 (file)
@@ -40,6 +40,8 @@
  *
  */
 
+#include <assert.h>
+
 #include "defs.h"
 #include "scheduler.h"
 #include "log.h"
index c521af1..2dd07d6 100644 (file)
@@ -205,6 +205,14 @@ olsr_init_tc(void)
   tc_myself = olsr_add_tc_entry(&olsr_cnf->main_addr);
 }
 
+void olsr_delete_all_tc_entries(void) {
+  struct tc_entry *tc;
+
+  OLSR_FOR_ALL_TC_ENTRIES(tc) {
+    olsr_delete_tc_entry(tc);
+  } OLSR_FOR_ALL_TC_ENTRIES_END(tc)
+}
+
 /**
  * The main ip address has changed.
  * Do the needful.
index 19c3912..ad94ecd 100644 (file)
@@ -142,6 +142,7 @@ extern struct avl_tree tc_tree;
 extern struct tc_entry *tc_myself;
 
 void olsr_init_tc(void);
+void olsr_delete_all_tc_entries(void);
 void olsr_change_myself_tc(void);
 void olsr_print_tc_table(void);
 void olsr_time_out_tc_set(void);