curl: Ensure all informationals are checked for completion

According to the documentation, the correct way to ensure all
informationals have been returned by curl_multi_info_read is to loop
until it returns NULL.

Signed-off-by: Matthew Booth <mbooth@redhat.com>
Tested-by: Richard W.M. Jones <rjones@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Matthew Booth 2014-04-29 16:03:31 +01:00 committed by Kevin Wolf
parent 838ef60249
commit 1f2cead324
1 changed files with 21 additions and 28 deletions

View File

@ -248,18 +248,15 @@ static void curl_multi_check_completion(BDRVCURLState *s)
/* Try to find done transfers, so we can free the easy
* handle again. */
do {
for (;;) {
CURLMsg *msg;
msg = curl_multi_info_read(s->multi, &msgs_in_queue);
/* Quit when there are no more completions */
if (!msg)
break;
if (msg->msg == CURLMSG_NONE)
break;
switch (msg->msg) {
case CURLMSG_DONE:
{
if (msg->msg == CURLMSG_DONE) {
CURLState *state = NULL;
curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE,
(char **)&state);
@ -283,11 +280,7 @@ static void curl_multi_check_completion(BDRVCURLState *s)
curl_clean_state(state);
break;
}
default:
msgs_in_queue = 0;
break;
}
} while(msgs_in_queue);
}
static void curl_multi_do(void *arg)