From: Stephan Bosch Date: Wed, 25 Jan 2023 14:19:30 +0000 (+0100) Subject: lib-http: http-client-request - Make sure connection output is unlocked if blocking... X-Git-Tag: 2.4.0~3034 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ce638e764a481bbe07da258e8402b975f04d4839;p=thirdparty%2Fdovecot%2Fcore.git lib-http: http-client-request - Make sure connection output is unlocked if blocking request receives response. Otherwise, a race condition between outgoing payload transmission and receiving the response may cause connection to hang. --- diff --git a/src/lib-http/http-client-connection.c b/src/lib-http/http-client-connection.c index df22d5a03e..371e370197 100644 --- a/src/lib-http/http-client-connection.c +++ b/src/lib-http/http-client-connection.c @@ -1445,6 +1445,7 @@ static void http_client_connection_ready(struct http_client_connection *conn) struct http_response response; conn->tunneling = TRUE; + req->state = HTTP_REQUEST_STATE_WAITING; i_zero(&response); response.status = 200; diff --git a/src/lib-http/http-client-request.c b/src/lib-http/http-client-request.c index 11aea5e2e3..b25f768b07 100644 --- a/src/lib-http/http-client-request.c +++ b/src/lib-http/http-client-request.c @@ -1524,6 +1524,10 @@ bool http_client_request_callback(struct http_client_request *req, http_client_request_callback_t *callback = req->callback; unsigned int orig_attempts = req->attempts; + i_assert(req->state >= HTTP_REQUEST_STATE_PAYLOAD_OUT); + i_assert(req->conn != NULL); + if (req->state == HTTP_REQUEST_STATE_PAYLOAD_OUT) + req->conn->output_locked = FALSE; req->state = HTTP_REQUEST_STATE_GOT_RESPONSE; req->last_status = response->status;