Bail out early if the request is too large.
[darkstat] / http.c
diff --git a/http.c b/http.c
index f583d01..fa77183 100644 (file)
--- a/http.c
+++ b/http.c
@@ -707,11 +707,10 @@ static void process_request(struct connection *conn)
  */
 static void poll_recv_request(struct connection *conn)
 {
-    #define BUFSIZE 65536
-    char buf[BUFSIZE];
+    char buf[65536];
     ssize_t recvd;
 
-    recvd = recv(conn->socket, buf, BUFSIZE, 0);
+    recvd = recv(conn->socket, buf, sizeof(buf), 0);
     dverbosef("poll_recv_request(%d) got %d bytes", conn->socket, (int)recvd);
     if (recvd <= 0)
     {
@@ -721,7 +720,6 @@ static void poll_recv_request(struct connection *conn)
         return;
     }
     conn->last_active = now;
-    #undef BUFSIZE
 
     /* append to conn->request */
     conn->request = xrealloc(conn->request, conn->request_length+recvd+1);
@@ -729,6 +727,15 @@ static void poll_recv_request(struct connection *conn)
     conn->request_length += recvd;
     conn->request[conn->request_length] = 0;
 
+    /* die if it's too long */
+    if (conn->request_length > MAX_REQUEST_LENGTH)
+    {
+        default_reply(conn, 413, "Request Entity Too Large",
+            "Your request was dropped because it was too long.");
+        conn->state = SEND_HEADER;
+        return;
+    }
+
     /* process request if we have all of it */
     if (conn->request_length > 4 &&
         memcmp(conn->request+conn->request_length-4, "\r\n\r\n", 4) == 0)
@@ -739,14 +746,6 @@ static void poll_recv_request(struct connection *conn)
         free(conn->request);
         conn->request = NULL; /* important: don't free it again later */
     }
-
-    /* die if it's too long */
-    if (conn->request_length > MAX_REQUEST_LENGTH)
-    {
-        default_reply(conn, 413, "Request Entity Too Large",
-            "Your request was dropped because it was too long.");
-        conn->state = SEND_HEADER;
-    }
 }