From: Stephan Bosch Date: Tue, 17 Oct 2017 14:28:06 +0000 (+0200) Subject: lib-http: server: Make sure broken connection input always causes the connection... X-Git-Tag: 2.3.0.rc1~776 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e2a5de324df523512c42086d8422e4e41adf2c28;p=thirdparty%2Fdovecot%2Fcore.git lib-http: server: Make sure broken connection input always causes the connection to be closed after response. --- diff --git a/src/lib-http/http-server-request.c b/src/lib-http/http-server-request.c index 5423a32ec3..8ff55eaf94 100644 --- a/src/lib-http/http-server-request.c +++ b/src/lib-http/http-server-request.c @@ -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, diff --git a/src/lib-http/http-server-response.c b/src/lib-http/http-server-response.c index 9b0f2e8447..f9218fc6c9 100644 --- a/src/lib-http/http-server-response.c +++ b/src/lib-http/http-server-response.c @@ -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");