From c33990a300674e24f47ff0f172f7efb10b63b88a Mon Sep 17 00:00:00 2001 From: Chris Dickens Date: Thu, 15 Oct 2020 21:40:19 -0700 Subject: [PATCH] core: Iterate over completed transfers using the correct list node Commit 006ca0fbaa ("Guard against getting stuck while handling events") caused a regression using the wrong list node when iterating a list. Fix this by introducing and using an alternate for_each iterator. Closes #796 Signed-off-by: Chris Dickens --- libusb/io.c | 2 +- libusb/libusbi.h | 3 +++ libusb/version_nano.h | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/libusb/io.c b/libusb/io.c index bf6876e..0e960dd 100644 --- a/libusb/io.c +++ b/libusb/io.c @@ -2112,7 +2112,7 @@ static int handle_event_trigger(struct libusb_context *ctx) list_cut(&completed_transfers, &ctx->completed_transfers); usbi_mutex_unlock(&ctx->event_data_lock); - __for_each_transfer_safe(&completed_transfers, itransfer, tmp) { + __for_each_completed_transfer_safe(&completed_transfers, itransfer, tmp) { list_del(&itransfer->completed_list); r = usbi_backend.handle_transfer_completion(itransfer); if (r) { diff --git a/libusb/libusbi.h b/libusb/libusbi.h index 8dce535..1249983 100644 --- a/libusb/libusbi.h +++ b/libusb/libusbi.h @@ -1363,6 +1363,9 @@ extern const struct usbi_os_backend usbi_backend; #define for_each_transfer_safe(ctx, t, n) \ __for_each_transfer_safe(&(ctx)->flying_transfers, t, n) +#define __for_each_completed_transfer_safe(list, t, n) \ + list_for_each_entry_safe(t, n, (list), completed_list, struct usbi_transfer) + #define for_each_event_source(ctx, e) \ for_each_helper(e, &(ctx)->event_sources, struct usbi_event_source) diff --git a/libusb/version_nano.h b/libusb/version_nano.h index 4a87c44..f4b4f9f 100644 --- a/libusb/version_nano.h +++ b/libusb/version_nano.h @@ -1 +1 @@ -#define LIBUSB_NANO 11567 +#define LIBUSB_NANO 11568 -- 2.34.1