From c80afa7573a9ca38b5ea789f9b0c21e8633efd2b Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Sat, 17 Feb 2018 15:17:06 +0100 Subject: [PATCH] lib-http: client: Hold reference to the connection while continuing request payload. Subsequent changes may cause the connection to be destroyed while sending. --- src/lib-http/http-client-connection.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lib-http/http-client-connection.c b/src/lib-http/http-client-connection.c index af125a7886..dade47e575 100644 --- a/src/lib-http/http-client-connection.c +++ b/src/lib-http/http-client-connection.c @@ -1192,10 +1192,12 @@ static void http_client_connection_input(struct connection *_conn) static int http_client_connection_continue_request(struct http_client_connection *conn) { + struct http_client_connection *tmp_conn; struct http_client_request *const *reqs; unsigned int count; struct http_client_request *req; bool pipelined; + int ret; reqs = array_get(&conn->request_wait_list, &count); if (count == 0 || !conn->output_locked) @@ -1219,7 +1221,10 @@ http_client_connection_continue_request(struct http_client_connection *conn) if (req->payload_sync && !req->payload_sync_continue) return 0; - if (http_client_request_send_more(req, pipelined) < 0) + tmp_conn = conn; + http_client_connection_ref(tmp_conn); + ret = http_client_request_send_more(req, pipelined); + if (!http_client_connection_unref(&tmp_conn) || ret < 0) return -1; if (!conn->output_locked) { -- 2.47.3