diff options
author | Pete Batard <pbatard@gmail.com> | 2010-02-11 00:01:32 +0000 |
---|---|---|
committer | Pete Batard <pbatard@gmail.com> | 2010-02-11 00:01:32 +0000 |
commit | 6ba1e6cb46d59df5bedae4779731565697166a95 (patch) | |
tree | a8583bf579c15a0b265b992dd86c822a8dea6336 /libusb/os/windows_usb.c | |
parent | 06f92a48c52f91a6784716fbd0a2c5856c30085f (diff) | |
download | libusb-6ba1e6cb46d59df5bedae4779731565697166a95.tar.gz |
fixed bad HID input report data when using controlr148
removes the use of transfer->buffer as dest in hid_copy_transfer_data
uses private hid_dest copy from windows_transfer_priv instead
Diffstat (limited to 'libusb/os/windows_usb.c')
-rw-r--r-- | libusb/os/windows_usb.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/libusb/os/windows_usb.c b/libusb/os/windows_usb.c index d1d9f0d..3042de1 100644 --- a/libusb/os/windows_usb.c +++ b/libusb/os/windows_usb.c @@ -3034,6 +3034,7 @@ static int _hid_get_report(struct hid_device_priv* dev, HANDLE hid_handle, int i return LIBUSB_ERROR_IO; } tp->hid_buffer = buf; + tp->hid_dest = data; // copy dest, as not necessarily the start of the transfer buffer return LIBUSB_SUCCESS; } #else @@ -3543,6 +3544,7 @@ static int hid_submit_bulk_transfer(struct usbi_transfer *itransfer) { return LIBUSB_ERROR_NO_MEM; } transfer_priv->hid_buffer = (uint8_t*)malloc(transfer->length+2); + transfer_priv->hid_dest = transfer->buffer; transfer_priv->hid_expected_size = transfer->length+2; if (transfer_priv->hid_buffer == NULL) { return LIBUSB_ERROR_NO_MEM; @@ -3666,8 +3668,12 @@ static int hid_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_s corrected_size = (uint32_t)transfer_priv->hid_expected_size; usbi_err(ctx, "OVERFLOW!"); r = LIBUSB_TRANSFER_OVERFLOW; + } else if (transfer_priv->hid_dest == NULL) { + usbi_err(ctx, "program assertion failed - copy destination address was not set"); + r = LIBUSB_TRANSFER_ERROR; + } else { + memcpy(transfer_priv->hid_dest, transfer_priv->hid_buffer+1, corrected_size); } - memcpy(transfer->buffer, transfer_priv->hid_buffer+1, corrected_size); safe_free(transfer_priv->hid_buffer); } else { // No hid_buffer => transfer was sync and our size is good |