[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 4/6] curl: Report only ready sockets
From: |
Max Reitz |
Subject: |
[Qemu-devel] [PATCH 4/6] curl: Report only ready sockets |
Date: |
Tue, 27 Aug 2019 18:34:37 +0200 |
Instead of reporting all sockets to cURL, only report the one that has
caused curl_multi_do_locked() to be called. This lets us get rid of the
QLIST_FOREACH_SAFE() list, which was actually wrong: SAFE foreaches are
only safe when the current element is removed in each iteration. If it
possible for the list to be concurrently modified, we cannot guarantee
that only the current element will be removed. Therefore, we must not
use QLIST_FOREACH_SAFE() here.
Fixes: ff5ca1664af85b24a4180d595ea6873fd3deac57
Cc: address@hidden
Signed-off-by: Max Reitz <address@hidden>
---
block/curl.c | 17 ++++++-----------
1 file changed, 6 insertions(+), 11 deletions(-)
diff --git a/block/curl.c b/block/curl.c
index 05f77a38c2..bc70f39fcb 100644
--- a/block/curl.c
+++ b/block/curl.c
@@ -394,24 +394,19 @@ static void curl_multi_check_completion(BDRVCURLState *s)
}
/* Called with s->mutex held. */
-static void curl_multi_do_locked(CURLSocket *ready_socket)
+static void curl_multi_do_locked(CURLSocket *socket)
{
- CURLSocket *socket, *next_socket;
- CURLState *s = socket->state;
+ BDRVCURLState *s = socket->state->s;
int running;
int r;
- if (!s->s->multi) {
+ if (!s->multi) {
return;
}
- /* Need to use _SAFE because curl_multi_socket_action() may trigger
- * curl_sock_cb() which might modify this list */
- QLIST_FOREACH_SAFE(socket, &s->sockets, next, next_socket) {
- do {
- r = curl_multi_socket_action(s->s->multi, socket->fd, 0, &running);
- } while (r == CURLM_CALL_MULTI_PERFORM);
- }
+ do {
+ r = curl_multi_socket_action(s->multi, socket->fd, 0, &running);
+ } while (r == CURLM_CALL_MULTI_PERFORM);
}
static void curl_multi_do(void *arg)
--
2.21.0
- [Qemu-devel] [PATCH 0/6] block/curl: Fix hang and potential crash, Max Reitz, 2019/08/27
- [Qemu-devel] [PATCH 1/6] curl: Keep pointer to the CURLState in CURLSocket, Max Reitz, 2019/08/27
- [Qemu-devel] [PATCH 2/6] curl: Keep *socket until the end of curl_sock_cb(), Max Reitz, 2019/08/27
- [Qemu-devel] [PATCH 3/6] curl: Pass CURLSocket to curl_multi_{do, read}(), Max Reitz, 2019/08/27
- [Qemu-devel] [PATCH 4/6] curl: Report only ready sockets,
Max Reitz <=
- [Qemu-devel] [PATCH 5/6] curl: Handle success in multi_check_completion, Max Reitz, 2019/08/27
- [Qemu-devel] [PATCH 6/6] curl: Check curl_multi_add_handle()'s return code, Max Reitz, 2019/08/27