]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: Fix bug with removal of http_client_request from delayed_requests.
authorsergey.kitov <sergey.kitov@open-xchange.com>
Tue, 4 Feb 2025 10:04:16 +0000 (12:04 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Mon, 19 May 2025 08:07:56 +0000 (08:07 +0000)
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.

src/lib-http/http-client-private.h
src/lib-http/http-client-queue.c

index 73e99eacc176f8c1286ddcb9eac3a5fa94ce1ae9..18c13787ee1cc0c358a27d5d6f9ec211b8e9e712 100644 (file)
@@ -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 {
index 7ce2273eb410b72866f0ecd53bce89009450c9df..533732bec8fa52050316508feae5be39def15fe4 100644 (file)
@@ -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);