Plug a memleak by correctly free'ing the HTTP descriptor that contains
authorreyk <reyk@openbsd.org>
Thu, 24 Jul 2014 08:32:36 +0000 (08:32 +0000)
committerreyk <reyk@openbsd.org>
Thu, 24 Jul 2014 08:32:36 +0000 (08:32 +0000)
all the headers etc. of a connection.

usr.sbin/httpd/httpd.c
usr.sbin/httpd/server.c
usr.sbin/httpd/server_http.c

index c87c2ad..d38b4d9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: httpd.c,v 1.6 2014/07/23 23:10:27 reyk Exp $  */
+/*     $OpenBSD: httpd.c,v 1.7 2014/07/24 08:32:36 reyk Exp $  */
 
 /*
  * Copyright (c) 2014 Reyk Floeter <reyk@openbsd.org>
@@ -720,8 +720,6 @@ kv_purge(struct kvtree *keys)
 void
 kv_free(struct kv *kv)
 {
-       if (kv->kv_type == KEY_TYPE_NONE)
-               return;
        if (kv->kv_key != NULL) {
                free(kv->kv_key);
        }
index 38151ea..913dbb5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: server.c,v 1.7 2014/07/23 13:26:39 reyk Exp $ */
+/*     $OpenBSD: server.c,v 1.8 2014/07/24 08:32:36 reyk Exp $ */
 
 /*
  * Copyright (c) 2006 - 2014 Reyk Floeter <reyk@openbsd.org>
@@ -550,6 +550,9 @@ server_close(struct client *clt, const char *msg)
 
        SPLAY_REMOVE(client_tree, &srv->srv_clients, clt);
 
+       /* free the HTTP descriptors incl. headers */
+       server_close_http(clt);
+
        event_del(&clt->clt_ev);
        if (clt->clt_bev != NULL)
                bufferevent_disable(clt->clt_bev, EV_READ|EV_WRITE);
@@ -575,7 +578,7 @@ server_close(struct client *clt, const char *msg)
 
        if (clt->clt_bev != NULL)
                bufferevent_free(clt->clt_bev);
-       else if (clt->clt_output != NULL)
+       if (clt->clt_output != NULL)
                evbuffer_free(clt->clt_output);
 
        if (clt->clt_file != NULL)
index 6e15456..21b4684 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: server_http.c,v 1.10 2014/07/23 21:43:12 reyk Exp $   */
+/*     $OpenBSD: server_http.c,v 1.11 2014/07/24 08:32:36 reyk Exp $   */
 
 /*
  * Copyright (c) 2006 - 2014 Reyk Floeter <reyk@openbsd.org>
@@ -110,6 +110,7 @@ server_httpdesc_free(struct http_descriptor *desc)
                desc->http_version = NULL;
        }
        kv_purge(&desc->http_headers);
+       desc->http_lastheader = NULL;
 }
 
 void