From: sergey.kitov Date: Tue, 4 Feb 2025 10:04:16 +0000 (+0200) Subject: lib-http: Fix bug with removal of http_client_request from delayed_requests. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5c56e2969444681d7894f66f69bd9652cca720da;p=thirdparty%2Fdovecot%2Fcore.git lib-http: Fix bug with removal of http_client_request from delayed_requests. Setting release_time to 0 in the beginning of http_client_queue_submit_now() prevents removing of the request from delayed_requests in case of failures. --- diff --git a/src/lib-http/http-client-private.h b/src/lib-http/http-client-private.h index 73e99eacc1..18c13787ee 100644 --- a/src/lib-http/http-client-private.h +++ b/src/lib-http/http-client-private.h @@ -165,6 +165,7 @@ struct http_client_request { bool connect_direct:1; bool ssl_tunnel:1; bool preserve_exact_reason:1; + bool request_is_delayed:1; }; struct http_client_connection { diff --git a/src/lib-http/http-client-queue.c b/src/lib-http/http-client-queue.c index 7ce2273eb4..533732bec8 100644 --- a/src/lib-http/http-client-queue.c +++ b/src/lib-http/http-client-queue.c @@ -640,7 +640,7 @@ void http_client_queue_drop_request(struct http_client_queue *queue, } /* Drop from delay queue */ - if (req->release_time.tv_sec > 0) { + if (req->request_is_delayed) { reqs = array_get_modifiable(&queue->delayed_requests, &count); for (i = 0; i < count; i++) { if (reqs[i] == req) @@ -659,6 +659,7 @@ void http_client_queue_drop_request(struct http_client_queue *queue, } array_delete(&queue->delayed_requests, i, 1); } + req->request_is_delayed = FALSE; } /* Drop from main request list */ @@ -960,6 +961,7 @@ void http_client_queue_submit_request(struct http_client_queue *queue, http_client_queue_delayed_cmp, &insert_idx); array_insert(&queue->delayed_requests, insert_idx, &req, 1); + req->request_is_delayed = TRUE; if (insert_idx == 0) { http_client_queue_set_delay_timer( queue, req->release_time);