Free lists of cmdline args in the DNS child.
authorEmil Mikulic <emikulic@gmail.com>
Sat, 27 Dec 2014 09:27:54 +0000 (20:27 +1100)
committerEmil Mikulic <emikulic@gmail.com>
Sat, 27 Dec 2014 09:27:54 +0000 (20:27 +1100)
This is a tiny amount of memory but it brings us closer to being valgrind clean.

cap.c
cap.h
dns.c

diff --git a/cap.c b/cap.c
index 2625655..e5f3a3e 100644 (file)
--- a/cap.c
+++ b/cap.c
@@ -468,6 +468,23 @@ void cap_stop(void) {
    title_interfaces = NULL;
 }
 
+/* This is only needed by the DNS child. In the main process, the deallocation
+ * happens in cap_start().
+ */
+void cap_free_args(void) {
+   while (!STAILQ_EMPTY(&cli_ifnames)) {
+      struct strnode *ifname = STAILQ_FIRST(&cli_ifnames);
+      STAILQ_REMOVE_HEAD(&cli_ifnames, entries);
+      free(ifname);
+   }
+
+   while (!STAILQ_EMPTY(&cli_filters)) {
+      struct strnode *filter = STAILQ_FIRST(&cli_filters);
+      STAILQ_REMOVE_HEAD(&cli_filters, entries);
+      free(filter);
+   }
+}
+
 /* Run through entire capfile. */
 void cap_from_file(const char *capfile) {
    char errbuf[PCAP_ERRBUF_SIZE];
diff --git a/cap.h b/cap.h
index 380c3b8..74a68de 100644 (file)
--- a/cap.h
+++ b/cap.h
@@ -1,5 +1,5 @@
 /* darkstat 3
- * copyright (c) 2001-2012 Emil Mikulic.
+ * copyright (c) 2001-2014 Emil Mikulic.
  *
  * cap.h: interface to libpcap.
  */
@@ -17,6 +17,7 @@ void cap_fd_set(fd_set *read_set, int *max_fd,
    struct timeval *timeout, int *need_timeout);
 int cap_poll(fd_set *read_set);
 void cap_stop(void);
+void cap_free_args(void);
 
 void cap_from_file(const char *capfile);
 
diff --git a/dns.c b/dns.c
index 811fe3c..163aa56 100644 (file)
--- a/dns.c
+++ b/dns.c
@@ -8,6 +8,7 @@
  */
 
 #include "cdefs.h"
+#include "cap.h"
 #include "conv.h"
 #include "decode.h"
 #include "dns.h"
@@ -65,6 +66,7 @@ dns_init(const char *privdrop_user)
       daemonize_finish(); /* drop our copy of the lifeline! */
       if (signal(SIGUSR1, SIG_IGN) == SIG_ERR)
          errx(1, "signal(SIGUSR1, ignore) failed");
+      cap_free_args();
       dns_main();
       errx(1, "DNS child fell out of dns_main()");
    } else {