From: Stephan Bosch Date: Wed, 24 May 2017 17:08:43 +0000 (+0200) Subject: lib-http: client: Explicitly destroy the response payload timeout stream when the... X-Git-Tag: 2.2.31.rc1~47 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9dc6c1c26c80e85fbada13c314ab748305e36a06;p=thirdparty%2Fdovecot%2Fcore.git lib-http: client: Explicitly destroy the response payload timeout stream when the request is destroyed while receiving payload. This way, the timeout is stopped. This caused ioloop panics. --- diff --git a/src/lib-http/http-client-connection.c b/src/lib-http/http-client-connection.c index 91238c1e56..35e3efb75e 100644 --- a/src/lib-http/http-client-connection.c +++ b/src/lib-http/http-client-connection.c @@ -643,6 +643,24 @@ static void http_client_payload_destroyed(struct http_client_request *req) http_client_peer_trigger_request_handler(conn->peer); } +void http_client_connection_request_destroyed( + struct http_client_connection *conn, struct http_client_request *req) +{ + struct istream *payload = conn->incoming_payload; + + i_assert(req->conn == conn); + if (conn->pending_request != req) + return; + + http_client_connection_debug(conn, + "Pending request destroyed prematurely"); + + if (payload == NULL) + return; + i_stream_ref(payload); + i_stream_destroy(&payload); +} + static bool http_client_connection_return_response( struct http_client_connection *conn, diff --git a/src/lib-http/http-client-private.h b/src/lib-http/http-client-private.h index afeaedb08e..9c3a3dc31a 100644 --- a/src/lib-http/http-client-private.h +++ b/src/lib-http/http-client-private.h @@ -413,6 +413,8 @@ bool http_client_connection_unref(struct http_client_connection **_conn); void http_client_connection_close(struct http_client_connection **_conn); void http_client_connection_peer_closed(struct http_client_connection **_conn); +void http_client_connection_request_destroyed( + struct http_client_connection *conn, struct http_client_request *req); int http_client_connection_output(struct http_client_connection *conn); void http_client_connection_start_request_timeout( diff --git a/src/lib-http/http-client-request.c b/src/lib-http/http-client-request.c index 5ebfc3500e..dd8bec586e 100644 --- a/src/lib-http/http-client-request.c +++ b/src/lib-http/http-client-request.c @@ -299,6 +299,10 @@ void http_client_request_destroy(struct http_client_request **_req) req->destroy_callback = NULL; callback(req->destroy_context); } + + if (req->conn != NULL) + http_client_connection_request_destroyed(req->conn, req); + http_client_request_remove(req); http_client_request_unref(&req); }