From: Pete Batard Date: Mon, 29 Oct 2012 23:41:23 +0000 (+0000) Subject: Windows: Fix access for composite HID devices X-Git-Tag: upstream/1.0.21~573 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fdff665a44169eda702a1267a3bbb4501d6bb3ee;p=platform%2Fupstream%2Flibusb.git Windows: Fix access for composite HID devices * composite_open was only catering for interfaces with WinUSB-like drivers and did not properly initialize HID driven ones * Issue reported by Stefano Di Martino --- diff --git a/libusb/os/windows_usb.c b/libusb/os/windows_usb.c index 332a368..914461d 100644 --- a/libusb/os/windows_usb.c +++ b/libusb/os/windows_usb.c @@ -1277,7 +1277,7 @@ static int set_composite_interface(struct libusb_context* ctx, struct libusb_dev priv->usb_interface[interface_number].apib = &usb_api_backend[api]; priv->usb_interface[interface_number].sub_api = sub_api; if ((api == USB_API_HID) && (priv->hid == NULL)) { - priv->hid = calloc(1, sizeof(struct hid_device_priv)); + priv->hid = (struct hid_device_priv*) calloc(1, sizeof(struct hid_device_priv)); if (priv->hid == NULL) return LIBUSB_ERROR_NO_MEM; } @@ -3886,7 +3886,7 @@ static int hid_submit_control_transfer(int sub_api, struct usbi_transfer *itrans // Always use the handle returned from usbi_create_fd (wfd.handle) wfd = usbi_create_fd(hid_handle, _O_RDONLY); if (wfd.fd < 0) { - return LIBUSB_ERROR_NO_MEM; + return LIBUSB_ERROR_NOT_FOUND; } switch(LIBUSB_REQ_TYPE(setup->request_type)) { @@ -4171,30 +4171,37 @@ static int composite_exit(int sub_api) static int composite_open(int sub_api, struct libusb_device_handle *dev_handle) { struct windows_device_priv *priv = _device_priv(dev_handle->dev); - int r; + int r = LIBUSB_ERROR_NOT_FOUND; uint8_t i; - bool available[SUB_API_MAX]; - - for (i = 0; iusb_interface[i].apib->id == USB_API_WINUSBX) - && (priv->usb_interface[i].sub_api != SUB_API_NOTSET) ) { - available[priv->usb_interface[i].sub_api] = true; + switch (priv->usb_interface[i].apib->id) { + case USB_API_WINUSBX: + if (priv->usb_interface[i].sub_api != SUB_API_NOTSET) + available[priv->usb_interface[i].sub_api] = true; + break; + case USB_API_HID: + available[SUB_API_MAX] = true; + break; + default: + break; } } - for (i=0; i