From c115faf2cd1635e32779a05d563a22773d1d9995 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 12 Feb 2018 18:23:46 +0100 Subject: [PATCH] embed/trezorhal/usb: correct handling of interface messages in usb_class_setup --- embed/trezorhal/usb.c | 28 +++++++++++-------- embed/trezorhal/usb_webusb-impl.h | 46 ++++++++++++------------------- 2 files changed, 33 insertions(+), 41 deletions(-) diff --git a/embed/trezorhal/usb.c b/embed/trezorhal/usb.c index 406cf8af7e..04b7742274 100644 --- a/embed/trezorhal/usb.c +++ b/embed/trezorhal/usb.c @@ -373,21 +373,25 @@ static uint8_t usb_class_setup(USBD_HandleTypeDef *dev, USBD_SetupReqTypedef *re } } } - } else if (req->wIndex >= USBD_MAX_NUM_INTERFACES) { - USBD_CtlError(dev, req); - return USBD_FAIL; - } - switch (usb_ifaces[req->wIndex].type) { - case USB_IFACE_TYPE_HID: - return usb_hid_class_setup(dev, &usb_ifaces[req->wIndex].hid, req); - case USB_IFACE_TYPE_VCP: - return usb_vcp_class_setup(dev, &usb_ifaces[req->wIndex].vcp, req); - case USB_IFACE_TYPE_WEBUSB: - return usb_webusb_class_setup(dev, &usb_ifaces[req->wIndex].webusb, req); - default: + } else + if ((req->bmRequest & USB_REQ_RECIPIENT_MASK) == USB_REQ_RECIPIENT_INTERFACE) { + if (req->wIndex >= USBD_MAX_NUM_INTERFACES) { USBD_CtlError(dev, req); return USBD_FAIL; + } + switch (usb_ifaces[req->wIndex].type) { + case USB_IFACE_TYPE_HID: + return usb_hid_class_setup(dev, &usb_ifaces[req->wIndex].hid, req); + case USB_IFACE_TYPE_VCP: + return usb_vcp_class_setup(dev, &usb_ifaces[req->wIndex].vcp, req); + case USB_IFACE_TYPE_WEBUSB: + return usb_webusb_class_setup(dev, &usb_ifaces[req->wIndex].webusb, req); + default: + USBD_CtlError(dev, req); + return USBD_FAIL; + } } + return USBD_OK; } static uint8_t usb_class_data_in(USBD_HandleTypeDef *dev, uint8_t ep_num) { diff --git a/embed/trezorhal/usb_webusb-impl.h b/embed/trezorhal/usb_webusb-impl.h index 380ae7ca7b..1fae80dd55 100644 --- a/embed/trezorhal/usb_webusb-impl.h +++ b/embed/trezorhal/usb_webusb-impl.h @@ -217,37 +217,25 @@ static void usb_webusb_class_deinit(USBD_HandleTypeDef *dev, usb_webusb_state_t static int usb_webusb_class_setup(USBD_HandleTypeDef *dev, usb_webusb_state_t *state, USBD_SetupReqTypedef *req) { - switch (req->bmRequest & USB_REQ_TYPE_MASK) { - - // Class request - case USB_REQ_TYPE_CLASS: - switch (req->bRequest) { - default: - USBD_CtlError(dev, req); - return USBD_FAIL; - } - break; - - // Interface & Endpoint request - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) { - - case USB_REQ_SET_INTERFACE: - state->alt_setting = req->wValue; - USBD_CtlSendStatus(dev); - return USBD_OK; - - case USB_REQ_GET_INTERFACE: - USBD_CtlSendData(dev, &state->alt_setting, sizeof(state->alt_setting)); - return USBD_OK; - default: - USBD_CtlError(dev, req); - return USBD_FAIL; - } - break; + if ((req->bmRequest & USB_REQ_TYPE_MASK) != USB_REQ_TYPE_STANDARD) { + return USBD_OK; } - return USBD_OK; + switch (req->bRequest) { + + case USB_REQ_SET_INTERFACE: + state->alt_setting = req->wValue; + USBD_CtlSendStatus(dev); + return USBD_OK; + + case USB_REQ_GET_INTERFACE: + USBD_CtlSendData(dev, &state->alt_setting, sizeof(state->alt_setting)); + return USBD_OK; + + default: + USBD_CtlError(dev, req); + return USBD_FAIL; + } } static void usb_webusb_class_data_in(USBD_HandleTypeDef *dev, usb_webusb_state_t *state, uint8_t ep_num) {