summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPete Batard <pete@akeo.ie>2013-11-27 22:02:55 +0000
committerPete Batard <pete@akeo.ie>2013-11-27 22:02:55 +0000
commit68bd52920ce6043678f6d19d1f221930e7a214d5 (patch)
tree7c5e678a83e4d4d3e41635b9af7674c2f5d352ba
parent850dc391cfc6e3f7e8cf917f8baf646ae7ca83a1 (diff)
downloadlibusb-68bd52920ce6043678f6d19d1f221930e7a214d5.tar.gz
Windows: Fix a crash when HID transfers return no data
* Issue reported by Surmakyynis * Closes #160
-rw-r--r--libusb/os/windows_usb.c26
-rw-r--r--libusb/version_nano.h2
2 files changed, 15 insertions, 13 deletions
diff --git a/libusb/os/windows_usb.c b/libusb/os/windows_usb.c
index b11cb93..aa4c0f4 100644
--- a/libusb/os/windows_usb.c
+++ b/libusb/os/windows_usb.c
@@ -4161,19 +4161,21 @@ static int hid_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer,
if (transfer_priv->hid_buffer != NULL) {
// If we have a valid hid_buffer, it means the transfer was async
if (transfer_priv->hid_dest != NULL) { // Data readout
- // First, check for overflow
- if (corrected_size > transfer_priv->hid_expected_size) {
- usbi_err(ctx, "OVERFLOW!");
- corrected_size = (uint32_t)transfer_priv->hid_expected_size;
- r = LIBUSB_TRANSFER_OVERFLOW;
- }
+ if (corrected_size > 0) {
+ // First, check for overflow
+ if (corrected_size > transfer_priv->hid_expected_size) {
+ usbi_err(ctx, "OVERFLOW!");
+ corrected_size = (uint32_t)transfer_priv->hid_expected_size;
+ r = LIBUSB_TRANSFER_OVERFLOW;
+ }
- if (transfer_priv->hid_buffer[0] == 0) {
- // Discard the 1 byte report ID prefix
- corrected_size--;
- memcpy(transfer_priv->hid_dest, transfer_priv->hid_buffer+1, corrected_size);
- } else {
- memcpy(transfer_priv->hid_dest, transfer_priv->hid_buffer, corrected_size);
+ if (transfer_priv->hid_buffer[0] == 0) {
+ // Discard the 1 byte report ID prefix
+ corrected_size--;
+ memcpy(transfer_priv->hid_dest, transfer_priv->hid_buffer+1, corrected_size);
+ } else {
+ memcpy(transfer_priv->hid_dest, transfer_priv->hid_buffer, corrected_size);
+ }
}
transfer_priv->hid_dest = NULL;
}
diff --git a/libusb/version_nano.h b/libusb/version_nano.h
index e9bdb4e..d88c0cc 100644
--- a/libusb/version_nano.h
+++ b/libusb/version_nano.h
@@ -1 +1 @@
-#define LIBUSB_NANO 10850
+#define LIBUSB_NANO 10851