]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: server: Make sure broken connection input always causes the connection...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Tue, 17 Oct 2017 14:28:06 +0000 (16:28 +0200)
committerStephan Bosch <stephan.bosch@dovecot.fi>
Tue, 24 Oct 2017 20:29:18 +0000 (22:29 +0200)
src/lib-http/http-server-request.c
src/lib-http/http-server-response.c

index 5423a32ec3c141a51696999f5e64b7d696443133..8ff55eaf94cfe4d8b907b14ad62381f7312f54c4 100644 (file)
@@ -323,18 +323,24 @@ void http_server_request_finished(struct http_server_request *req)
        http_server_connection_remove_request(conn, req);
        conn->stats.response_count++;
 
-       if (tunnel_callback == NULL && (req->req.connection_close || resp->close)) {
+       if (tunnel_callback == NULL) {
                if (resp->close) {
                        http_server_connection_close(&conn,
                                t_strdup_printf("Server closed connection: %u %s",
                                        resp->status, resp->reason));
-                       
-               } else {
+                       http_server_request_destroy(&req);
+                       return;
+               } else if (req->conn->input_broken) {
+                       http_server_connection_close(&conn,
+                               "Connection input is broken");
+                       http_server_request_destroy(&req);
+                       return;
+               } else if (req->req.connection_close) {
                        http_server_connection_close(&conn,
                                "Client requested connection close");
+                       http_server_request_destroy(&req);
+                       return;
                }
-               http_server_request_destroy(&req);
-               return;
        }
 
        http_server_request_destroy(&req);
@@ -385,8 +391,7 @@ http_server_request_fail_full(struct http_server_request *req,
 void http_server_request_fail(struct http_server_request *req,
        unsigned int status, const char *reason)
 {
-       http_server_request_fail_full(req, status, reason,
-                                     req->conn->input_broken);
+       http_server_request_fail_full(req, status, reason, FALSE);
 }
 
 void http_server_request_fail_close(struct http_server_request *req,
index 9b0f2e844740f2f0cff78d9b8796ff2484d166a4..f9218fc6c926c2625ede1e4090a28eb353f502af 100644 (file)
@@ -638,7 +638,8 @@ static int http_server_response_send_real(struct http_server_response *resp,
                        str_append(rtext, "Content-Length: 0\r\n");
        }
        if (!resp->have_hdr_connection) {
-               if (resp->close && resp->tunnel_callback == NULL)
+               bool close = resp->close || req->conn->input_broken;
+               if (close && resp->tunnel_callback == NULL)
                        str_append(rtext, "Connection: close\r\n");
                else if (http_server_request_version_equals(req, 1, 0))
                        str_append(rtext, "Connection: Keep-Alive\r\n");