From a584d060c853c9867dabc915fbafcbeccba1bc12 Mon Sep 17 00:00:00 2001 From: Bohdan Tymkiv Date: Wed, 28 Jul 2021 17:46:04 +0300 Subject: Windows: Partial fix for data race in composite_copy_transfer_data 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 | 17 +++++------------ libusb/version_nano.h | 2 +- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/libusb/os/windows_winusb.c b/libusb/os/windows_winusb.c index df40773..f6ed979 100644 --- a/libusb/os/windows_winusb.c +++ b/libusb/os/windows_winusb.c @@ -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; } diff --git a/libusb/version_nano.h b/libusb/version_nano.h index 5046b32..191a7e7 100644 --- a/libusb/version_nano.h +++ b/libusb/version_nano.h @@ -1 +1 @@ -#define LIBUSB_NANO 11658 +#define LIBUSB_NANO 11659 -- cgit v1.2.1