From a28a80d59e8f111fa5a23bfb76c8ff148333edb0 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 22 Nov 2022 03:32:42 -0500 Subject: [PATCH] examples/10-at-a-time: fix possible skipped final transfers Prior to this change if curl_multi_perform returned 0 running handles and then all remaining transfers were added, then the perform loop would end immediately without performing those transfers. Reported-by: Mikhail Kuznetsov Fixes https://github.com/curl/curl/issues/9953 Closes https://github.com/curl/curl/pull/9954 --- docs/examples/10-at-a-time.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/docs/examples/10-at-a-time.c b/docs/examples/10-at-a-time.c index 1739a9e78c..395b68c191 100644 --- a/docs/examples/10-at-a-time.c +++ b/docs/examples/10-at-a-time.c @@ -95,13 +95,14 @@ static size_t write_cb(char *data, size_t n, size_t l, void *userp) return n*l; } -static void add_transfer(CURLM *cm, int i) +static void add_transfer(CURLM *cm, int i, int *left) { CURL *eh = curl_easy_init(); curl_easy_setopt(eh, CURLOPT_WRITEFUNCTION, write_cb); curl_easy_setopt(eh, CURLOPT_URL, urls[i]); curl_easy_setopt(eh, CURLOPT_PRIVATE, urls[i]); curl_multi_add_handle(cm, eh); + (*left)++; } int main(void) @@ -110,7 +111,7 @@ int main(void) CURLMsg *msg; unsigned int transfers = 0; int msgs_left = -1; - int still_alive = 1; + int left = 0; curl_global_init(CURL_GLOBAL_ALL); cm = curl_multi_init(); @@ -118,10 +119,12 @@ int main(void) /* Limit the amount of simultaneous connections curl should allow: */ curl_multi_setopt(cm, CURLMOPT_MAXCONNECTS, (long)MAX_PARALLEL); - for(transfers = 0; transfers < MAX_PARALLEL; transfers++) - add_transfer(cm, transfers); + for(transfers = 0; transfers < MAX_PARALLEL && transfers < NUM_URLS; + transfers++) + add_transfer(cm, transfers, &left); do { + int still_alive = 1; curl_multi_perform(cm, &still_alive); while((msg = curl_multi_info_read(cm, &msgs_left))) { @@ -133,17 +136,18 @@ int main(void) msg->data.result, curl_easy_strerror(msg->data.result), url); curl_multi_remove_handle(cm, e); curl_easy_cleanup(e); + left--; } else { fprintf(stderr, "E: CURLMsg (%d)\n", msg->msg); } if(transfers < NUM_URLS) - add_transfer(cm, transfers++); + add_transfer(cm, transfers++, &left); } - if(still_alive) + if(left) curl_multi_wait(cm, NULL, 0, 1000, NULL); - } while(still_alive || (transfers < NUM_URLS)); + } while(left); curl_multi_cleanup(cm); curl_global_cleanup(); -- 2.47.3