Bail out early if the request is too large.
authorMalte S. Stretz <mss@apache.org>
Wed, 22 Jun 2011 20:27:53 +0000 (22:27 +0200)
committerEmil Mikulic <emikulic@gmail.com>
Sun, 11 Sep 2011 10:50:09 +0000 (20:50 +1000)
There is no point parsing the request first.

http.c

diff --git a/http.c b/http.c
index 642f706..fa77183 100644 (file)
--- a/http.c
+++ b/http.c
@@ -727,6 +727,15 @@ static void poll_recv_request(struct connection *conn)
     conn->request_length += recvd;
     conn->request[conn->request_length] = 0;
 
     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)
     /* 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)
@@ -737,14 +746,6 @@ static void poll_recv_request(struct connection *conn)
         free(conn->request);
         conn->request = NULL; /* important: don't free it again later */
     }
         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;
-    }
 }
 
 
 }