Windows: Partial fix for data race in composite_copy_transfer_data
authorBohdan Tymkiv <bohdan200@gmail.com>
Wed, 28 Jul 2021 14:46:04 +0000 (17:46 +0300)
committerTormod Volden <debian.tormod@gmail.com>
Sat, 30 Oct 2021 13:20:35 +0000 (15:20 +0200)
This only fixes issue (A):
libusb: error [composite_copy_transfer_data] program assertion failed - no function to copy transfer data

References #966
Closes #967

libusb/os/windows_winusb.c
libusb/version_nano.h

index df40773..f6ed979 100644 (file)
@@ -2794,6 +2794,7 @@ static int winusbx_submit_control_transfer(int sub_api, struct usbi_transfer *it
 
        usbi_dbg(ITRANSFER_CTX(itransfer), "will use interface %d", current_interface);
 
+       transfer_priv->interface_number = (uint8_t)current_interface;
        winusb_handle = handle_priv->interface_handle[current_interface].api_handle;
        set_transfer_priv_handle(itransfer, handle_priv->interface_handle[current_interface].dev_handle);
        overlapped = get_transfer_priv_overlapped(itransfer);
@@ -2816,8 +2817,6 @@ static int winusbx_submit_control_transfer(int sub_api, struct usbi_transfer *it
                }
        }
 
-       transfer_priv->interface_number = (uint8_t)current_interface;
-
        return LIBUSB_SUCCESS;
 }
 
@@ -2896,6 +2895,7 @@ static int winusbx_submit_iso_transfer(int sub_api, struct usbi_transfer *itrans
 
        usbi_dbg(TRANSFER_CTX(transfer), "matched endpoint %02X with interface %d", transfer->endpoint, current_interface);
 
+       transfer_priv->interface_number = (uint8_t)current_interface;
        winusb_handle = handle_priv->interface_handle[current_interface].api_handle;
        set_transfer_priv_handle(itransfer, handle_priv->interface_handle[current_interface].dev_handle);
        overlapped = get_transfer_priv_overlapped(itransfer);
@@ -2940,8 +2940,6 @@ static int winusbx_submit_iso_transfer(int sub_api, struct usbi_transfer *itrans
                        return LIBUSB_ERROR_IO;
                }
 
-               transfer_priv->interface_number = (uint8_t)current_interface;
-
                return LIBUSB_SUCCESS;
        } else if (sub_api == SUB_API_WINUSB) {
                WINUSB_PIPE_INFORMATION_EX pipe_info_ex = { 0 };
@@ -3056,8 +3054,6 @@ static int winusbx_submit_iso_transfer(int sub_api, struct usbi_transfer *itrans
 
                transfer_priv->isoch_buffer_handle = buffer_handle;
 
-               transfer_priv->interface_number = (uint8_t)current_interface;
-
                return LIBUSB_SUCCESS;
        } else {
                PRINT_UNSUPPORTED_API(winusbx_submit_iso_transfer);
@@ -3086,6 +3082,7 @@ static int winusbx_submit_bulk_transfer(int sub_api, struct usbi_transfer *itran
 
        usbi_dbg(TRANSFER_CTX(transfer), "matched endpoint %02X with interface %d", transfer->endpoint, current_interface);
 
+       transfer_priv->interface_number = (uint8_t)current_interface;
        winusb_handle = handle_priv->interface_handle[current_interface].api_handle;
        set_transfer_priv_handle(itransfer, handle_priv->interface_handle[current_interface].dev_handle);
        overlapped = get_transfer_priv_overlapped(itransfer);
@@ -3120,8 +3117,6 @@ static int winusbx_submit_bulk_transfer(int sub_api, struct usbi_transfer *itran
                return LIBUSB_ERROR_IO;
        }
 
-       transfer_priv->interface_number = (uint8_t)current_interface;
-
        return LIBUSB_SUCCESS;
 }
 
@@ -3995,6 +3990,7 @@ static int hid_submit_control_transfer(int sub_api, struct usbi_transfer *itrans
 
        usbi_dbg(ITRANSFER_CTX(itransfer), "will use interface %d", current_interface);
 
+       transfer_priv->interface_number = (uint8_t)current_interface;
        hid_handle = handle_priv->interface_handle[current_interface].api_handle;
        set_transfer_priv_handle(itransfer, hid_handle);
        overlapped = get_transfer_priv_overlapped(itransfer);
@@ -4056,8 +4052,6 @@ static int hid_submit_control_transfer(int sub_api, struct usbi_transfer *itrans
                r = LIBUSB_SUCCESS;
        }
 
-       transfer_priv->interface_number = (uint8_t)current_interface;
-
        return LIBUSB_SUCCESS;
 }
 
@@ -4090,6 +4084,7 @@ static int hid_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer
 
        usbi_dbg(TRANSFER_CTX(transfer), "matched endpoint %02X with interface %d", transfer->endpoint, current_interface);
 
+       transfer_priv->interface_number = (uint8_t)current_interface;
        hid_handle = handle_priv->interface_handle[current_interface].api_handle;
        set_transfer_priv_handle(itransfer, hid_handle);
        overlapped = get_transfer_priv_overlapped(itransfer);
@@ -4130,8 +4125,6 @@ static int hid_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer
                return LIBUSB_ERROR_IO;
        }
 
-       transfer_priv->interface_number = (uint8_t)current_interface;
-
        return LIBUSB_SUCCESS;
 }
 
index 5046b32..191a7e7 100644 (file)
@@ -1 +1 @@
-#define LIBUSB_NANO 11658
+#define LIBUSB_NANO 11659