]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: client: Fixed crash occurring sometimes when delay timeout expired.
authorStephan Bosch <stephan@rename-it.nl>
Tue, 30 Sep 2014 20:49:45 +0000 (23:49 +0300)
committerStephan Bosch <stephan@rename-it.nl>
Tue, 30 Sep 2014 20:49:45 +0000 (23:49 +0300)
Forgot to drop destroyed requests from delay queue.

src/lib-http/http-client-queue.c
src/lib-http/http-client-request.c

index d23df71a0e1739e7baa1a721a9b8d8cfc0af3254..9778fb771af2cbb3fff76f29ebfa5fbe242f5c40 100644 (file)
@@ -144,15 +144,28 @@ void
 http_client_queue_drop_request(struct http_client_queue *queue,
        struct http_client_request *req)
 {
-       ARRAY_TYPE(http_client_request) *req_arr = &queue->request_queue;
+       ARRAY_TYPE(http_client_request) *req_arr;
        struct http_client_request **req_idx;
 
+       /* remove from main queue */
+       req_arr = &queue->request_queue;
        array_foreach_modifiable(req_arr, req_idx) {
                if (*req_idx == req) {
                        array_delete(req_arr, array_foreach_idx(req_arr, req_idx), 1);
                        break;
                }
        }
+
+       /* remove from delay queue */
+       if (req->release_time.tv_sec > 0) {
+               req_arr = &queue->delayed_request_queue;
+               array_foreach_modifiable(req_arr, req_idx) {
+                       if (*req_idx == req) {
+                               array_delete(req_arr, array_foreach_idx(req_arr, req_idx), 1);
+                               break;
+                       }
+               }
+       }
 }
 
 static bool
index 35a180f7a97ce5285f70e243d1e456288a4fdab0..0069d8936248c8ddddbbf92fa4aea9cffc1faec0 100644 (file)
@@ -163,6 +163,9 @@ void http_client_request_unref(struct http_client_request **_req)
        http_client_request_debug(req, "Destroy (requests left=%d)",
                client->pending_requests);
 
+       if (req->queue != NULL)
+               http_client_queue_drop_request(req->queue, req);
+
        if (client->pending_requests == 0 && client->ioloop != NULL)
                io_loop_stop(client->ioloop);