core: Iterate over completed transfers using the correct list node
authorChris Dickens <christopher.a.dickens@gmail.com>
Fri, 16 Oct 2020 04:40:19 +0000 (21:40 -0700)
committerChris Dickens <christopher.a.dickens@gmail.com>
Fri, 16 Oct 2020 04:40:19 +0000 (21:40 -0700)
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 <christopher.a.dickens@gmail.com>
libusb/io.c
libusb/libusbi.h
libusb/version_nano.h

index bf6876e6efa8624414f165cb13e8e406616c3c8d..0e960ddfddd5292db40d8829084079eb081ad69d 100644 (file)
@@ -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) {
index 8dce535f9e6bf984e04f646b78b7195be9bc2d94..1249983a0bddbf4e7cd4cdacf3cb31e73679168c 100644 (file)
@@ -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)
 
index 4a87c44faaca945b40f7f50fb6678fe9651c6bd4..f4b4f9fe465f28452d1b6d95db91e44acb1c4cdb 100644 (file)
@@ -1 +1 @@
-#define LIBUSB_NANO 11567
+#define LIBUSB_NANO 11568