When the HTTP client did close the connection while relayd was still
authorbluhm <bluhm@openbsd.org>
Wed, 29 Apr 2015 08:41:24 +0000 (08:41 +0000)
committerbluhm <bluhm@openbsd.org>
Wed, 29 Apr 2015 08:41:24 +0000 (08:41 +0000)
parsig the HTTP header, the session was never destroyed.  This
resulted in a file descriptor leak.
Add a check wether the protocol knows how much data to expect.  If
relayd is reading unlimited data or is expecting nothing to read,
ignore the end-of-file.  Otherwise it is a protocol violation, so
close the session immediately.
While there, make relayd compile with DEBUG defined.
Based on a diff from claudio@; tested by claudio@; OK claudio@ benno@

usr.sbin/relayd/relay.c
usr.sbin/relayd/relay_http.c

index 1fef01f..1fd32dc 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: relay.c,v 1.192 2015/04/23 17:03:01 florian Exp $     */
+/*     $OpenBSD: relay.c,v 1.193 2015/04/29 08:41:24 bluhm Exp $       */
 
 /*
  * Copyright (c) 2006 - 2014 Reyk Floeter <reyk@openbsd.org>
@@ -988,7 +988,7 @@ relay_error(struct bufferevent *bev, short error, void *arg)
                        dst = EVBUFFER_OUTPUT(cre->dst->bev);
                        if (EVBUFFER_LENGTH(dst))
                                return;
-               } else
+               } else if (cre->toread == TOREAD_UNLIMITED || cre->toread == 0)
                        return;
 
                relay_close(con, "done");
@@ -1263,7 +1263,7 @@ relay_from_table(struct rsession *con)
                        return (-1);
        }
        host = rlt->rlt_host[idx];
-       DPRINTF("%s: session %d: table %s host %s, p 0x%08x, idx %d",
+       DPRINTF("%s: session %d: table %s host %s, p 0x%016llx, idx %d",
            __func__, con->se_id, table->conf.name, host->conf.name, p, idx);
        while (host != NULL) {
                DPRINTF("%s: session %d: host %s", __func__,
index 1d0b322..97bff86 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: relay_http.c,v 1.43 2015/01/22 17:42:09 reyk Exp $    */
+/*     $OpenBSD: relay_http.c,v 1.44 2015/04/29 08:41:24 bluhm Exp $   */
 
 /*
  * Copyright (c) 2006 - 2015 Reyk Floeter <reyk@openbsd.org>
@@ -35,6 +35,9 @@
 #include <fnmatch.h>
 #include <siphash.h>
 #include <imsg.h>
+#if DEBUG > 1
+#include <unistd.h>
+#endif
 
 #include "relayd.h"
 #include "http.h"