From 16eb9a737d42017fc875ef7b68afc25c3c9f8979 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Tue, 30 Sep 2014 23:49:45 +0300 Subject: [PATCH] lib-http: client: Fixed crash occurring sometimes when delay timeout expired. Forgot to drop destroyed requests from delay queue. --- src/lib-http/http-client-queue.c | 15 ++++++++++++++- src/lib-http/http-client-request.c | 3 +++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/lib-http/http-client-queue.c b/src/lib-http/http-client-queue.c index d23df71a0e..9778fb771a 100644 --- a/src/lib-http/http-client-queue.c +++ b/src/lib-http/http-client-queue.c @@ -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 diff --git a/src/lib-http/http-client-request.c b/src/lib-http/http-client-request.c index 35a180f7a9..0069d89362 100644 --- a/src/lib-http/http-client-request.c +++ b/src/lib-http/http-client-request.c @@ -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); -- 2.47.3