From a66ede53092dcca9c908444598e0ba07cce0ccb0 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 4 Mar 2025 14:00:03 +0100 Subject: [PATCH] multi: start the loop over when handles are removed Since more than one handle can be removed in a single call to multi_runsingle(), we cannot easily continue on the next node when a node has been removed since that node migth ALSO have been removed. Reported-by: Philippe Antoine Closes #16588 --- lib/multi.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/multi.c b/lib/multi.c index ae221d4f46..f347580702 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -2601,6 +2601,7 @@ CURLMcode curl_multi_perform(CURLM *m, int *running_handles) for(e = Curl_llist_head(&multi->process); e; e = n) { struct Curl_easy *data = Curl_node_elem(e); CURLMcode result; + unsigned int num_alive = multi->num_alive; /* Do the loop and only alter the signal ignore state if the next handle has a different NO_SIGNAL state than the previous */ if(first) { @@ -2619,6 +2620,12 @@ CURLMcode curl_multi_perform(CURLM *m, int *running_handles) if(result) returncode = result; } + if(num_alive != multi->num_alive) + /* Since more than one handle can be removed in a single call to + multi_runsingle(), we cannot easily continue on the next node when a + node has been removed since that node might ALSO have been + removed. */ + n = Curl_llist_head(&multi->process); } sigpipe_apply(multi->admin, &pipe_st); -- 2.47.3