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
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 @@
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 @@
}
}
- transfer_priv->interface_number = (uint8_t)current_interface;
-
return LIBUSB_SUCCESS;
}
@@ -2896,6 +2895,7 @@
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 @@
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 @@
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 @@
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 @@
return LIBUSB_ERROR_IO;
}
- transfer_priv->interface_number = (uint8_t)current_interface;
-
return LIBUSB_SUCCESS;
}
@@ -3995,6 +3990,7 @@
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 @@
r = LIBUSB_SUCCESS;
}
- transfer_priv->interface_number = (uint8_t)current_interface;
-
return LIBUSB_SUCCESS;
}
@@ -4090,6 +4084,7 @@
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 @@
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