Don't leak base_url memory.
authorEmil Mikulic <emikulic@gmail.com>
Sun, 15 May 2011 10:25:55 +0000 (20:25 +1000)
committerEmil Mikulic <emikulic@gmail.com>
Sat, 28 May 2011 10:10:53 +0000 (20:10 +1000)
darkstat.c
http.c
http.h

index 22a55cf..c2c2418 100644 (file)
@@ -134,7 +134,8 @@ static void cb_local(const char *arg) { acct_init_localnet(arg); }
 const char *chroot_dir = NULL;
 static void cb_chroot(const char *arg) { chroot_dir = arg; }
 
-static void cb_base(const char *arg) { http_init_base(arg); }
+const char *base = NULL;
+static void cb_base(const char *arg) { base = arg; }
 
 const char *privdrop_user = NULL;
 static void cb_user(const char *arg) { privdrop_user = arg; }
@@ -414,7 +415,7 @@ main(int argc, char **argv)
    /* do this first as it forks - minimize memory use */
    if (want_dns) dns_init(privdrop_user);
    cap_init(interface, filter, want_promisc); /* needs root */
-   http_init(bindaddr, bindport, /*maxconn=*/ -1); /* low ports need root */
+   http_init(base, bindaddr, bindport, /*maxconn=*/-1);
    ncache_init(); /* must do before chroot() */
 
    privdrop(chroot_dir, privdrop_user);
@@ -487,6 +488,7 @@ main(int argc, char **argv)
    verbosef("shutting down");
    verbosef("pcap stats: %u packets received, %u packets dropped",
       pkts_recv, pkts_drop);
+   http_stop();
    cap_stop();
    dns_stop();
    if (export_fn != NULL) db_export(export_fn);
diff --git a/http.c b/http.c
index 08b6bf7..898f6a3 100644 (file)
--- a/http.c
+++ b/http.c
@@ -34,7 +34,7 @@
 #include <unistd.h>
 #include <zlib.h>
 
-const char *base_url = "/";
+char *base_url = NULL;
 
 static const char mime_type_xml[] = "text/xml";
 static const char mime_type_html[] = "text/html; charset=us-ascii";
@@ -883,11 +883,16 @@ static void poll_send_reply(struct connection *conn)
 /* --------------------------------------------------------------------------
  * Initialize the base path.
  */
-void http_init_base(const char *url)
+static void http_init_base(const char *url)
 {
     char *slashed_url, *safe_url;
     size_t urllen;
 
+    if (url == NULL) {
+        base_url = strdup("/");
+        return;
+    }
+
     /* make sure that the url has leading and trailing slashes */
     urllen = strlen(url);
     slashed_url = xmalloc(urllen+3);
@@ -898,27 +903,29 @@ void http_init_base(const char *url)
     /* clean the url */
     safe_url = make_safe_uri(slashed_url);
     free(slashed_url);
-    if (safe_url == NULL)
-    {
-        verbosef("invalid base \"%s\", ignored", url, "/");
+    if (safe_url == NULL) {
+        verbosef("invalid base \"%s\", ignored", url);
+        base_url = strdup("/"); /* set to default */
         return;
     }
-
-    base_url = safe_url;
+    else
+        base_url = safe_url;
 }
 
 /* --------------------------------------------------------------------------
  * Initialize the sockin global.  This is the socket that we accept
  * connections from.  Pass -1 as max_conn for system limit.
  */
-void http_init(const char *bindaddr, const unsigned short bindport,
-   const int max_conn)
+void http_init(const char *base, const char *bindaddr,
+    const unsigned short bindport, const int max_conn)
 {
     struct sockaddr_storage addrin;
     struct addrinfo hints, *ai, *aiptr;
     char ipaddr[INET6_ADDRSTRLEN], portstr[12];
     int sockopt, ret;
 
+    http_init_base(base);
+
     memset(&hints, 0, sizeof(hints));
     hints.ai_family = AF_UNSPEC;
     hints.ai_socktype = SOCK_STREAM;
@@ -1080,4 +1087,9 @@ void http_poll(fd_set *recv_set, fd_set *send_set)
     }
 }
 
+void http_stop(void) {
+    free(base_url);
+    close(sockin);
+}
+
 /* vim:set ts=4 sw=4 et tw=78: */
diff --git a/http.h b/http.h
index ab45f8a..a3cbf5a 100644 (file)
--- a/http.h
+++ b/http.h
@@ -8,13 +8,13 @@
 #include <sys/select.h>
 #include <netinet/in.h>
 
-extern const char *base_url;
+extern char *base_url;
 
-void http_init_base(const char *path);
-void http_init(const char * bindaddr, const unsigned short bindport,
-   const int max_conn);
+void http_init(const char *base, const char * bindaddr,
+   const unsigned short bindport, const int max_conn);
 void http_fd_set(fd_set *recv_set, fd_set *send_set, int *max_fd,
    struct timeval *timeout, int *need_timeout);
 void http_poll(fd_set *read_set, fd_set *write_set);
+void http_stop(void);
 
 /* vim:set ts=3 sw=3 tw=78 expandtab: */