dyn_gw: fix memory leaks on the shutdown path
authorFerry Huberts <ferry.huberts@pelagic.nl>
Sat, 30 Apr 2016 16:15:05 +0000 (18:15 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Sat, 30 Apr 2016 20:41:03 +0000 (22:41 +0200)
Found with SANITIZE_LEAK=1

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/dyn_gw/src/olsrd_dyn_gw.c
lib/dyn_gw/src/olsrd_dyn_gw.h
lib/dyn_gw/src/olsrd_plugin.c

index 2560d85..928b037 100644 (file)
@@ -310,6 +310,29 @@ olsrd_plugin_init(void)
   return 1;
 }
 
+void olsrd_plugin_fini(void) {
+  if (!hna_groups) {
+    return;
+  }
+
+  while (hna_groups->ping_hosts) {
+    struct ping_list* next = hna_groups->ping_hosts->next;
+    free(hna_groups->ping_hosts->ping_address);
+    free(hna_groups->ping_hosts);
+    hna_groups->ping_hosts = next;
+  }
+
+  while (hna_groups->hna_list) {
+    struct hna_list * next = hna_groups->hna_list->next;
+    free(hna_groups->hna_list);
+    hna_groups->hna_list = next;
+  }
+
+  free(hna_groups);
+  hna_groups = NULL;
+}
+
+
 /**
  * Scheduled event to update the hna table,
  * called from olsrd main thread to keep the hna table thread-safe
index b6f0832..201cce6 100644 (file)
@@ -63,6 +63,8 @@
 
 int olsrd_plugin_init(void);
 
+void olsrd_plugin_fini(void);
+
 int olsrd_plugin_interface_version(void);
 
 void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size);
index 8c99420..21119df 100644 (file)
@@ -47,6 +47,7 @@
 #include "olsrd_dyn_gw.h"
 #include "olsr.h"
 #include "builddata.h"
+#include "olsrd_dyn_gw.h"
 #include <stdio.h>
 
 #define PLUGIN_NAME              "OLSRD dyn_gw plugin"
@@ -57,6 +58,7 @@
  */
 
 static void my_init(void) __attribute__ ((constructor));
+static void my_fini(void) __attribute__ ((destructor));
 
 /*
  * Defines the version of the plugin interface that is used
@@ -79,6 +81,15 @@ my_init(void)
   olsr_printf(0, "%s (%s)\n", PLUGIN_NAME, git_descriptor);
 }
 
+/**
+ *Destructor
+ */
+void
+my_fini(void)
+{
+  olsrd_plugin_fini();
+}
+
 /*
  * Local Variables:
  * c-basic-offset: 2