summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBohdan Tymkiv <bohdan200@gmail.com>2021-07-28 17:46:04 +0300
committerTormod Volden <debian.tormod@gmail.com>2021-10-30 15:20:35 +0200
commita584d060c853c9867dabc915fbafcbeccba1bc12 (patch)
tree0a5ac40ef0d09e585371630b0674067b894fc444
parent8d7616886e062f58d0de12db2acd5d81e06240bb (diff)
downloadlibusb-a584d060c853c9867dabc915fbafcbeccba1bc12.tar.gz
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
-rw-r--r--libusb/os/windows_winusb.c17
-rw-r--r--libusb/version_nano.h2
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