[PATCH] usbip: vhci_hcd: do proper error handling

From: Muhammad Usama Anjum
Date: Thu Mar 25 2021 - 07:48:13 EST


The driver was assuming that all the parameters would be valid. But it
is possible that parameters are sent from userspace. For those cases,
appropriate error checks have been added.

Porting partial fix from:
c318840fb2 ("USB: Gadget: dummy-hcd: Fix shift-out-of-bounds bug")

Signed-off-by: Muhammad Usama Anjum <musamaanjum@xxxxxxxxx>
---
drivers/usb/usbip/vhci_hcd.c | 25 ++++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/drivers/usb/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c
index 3209b5ddd30c..e32c080a2825 100644
--- a/drivers/usb/usbip/vhci_hcd.c
+++ b/drivers/usb/usbip/vhci_hcd.c
@@ -393,13 +393,24 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
else
vhci_hcd->port_status[rhport] &= ~USB_PORT_STAT_POWER;
break;
- default:
- usbip_dbg_vhci_rh(" ClearPortFeature: default %x\n",
- wValue);
+ case USB_PORT_FEAT_ENABLE:
+ case USB_PORT_FEAT_C_ENABLE:
+ case USB_PORT_FEAT_C_SUSPEND:
+ /* Not allowed for USB-3 */
+ if (hcd->speed == HCD_USB3)
+ goto error;
+ fallthrough;
+ case USB_PORT_FEAT_C_CONNECTION:
+ case USB_PORT_FEAT_C_RESET:
if (wValue >= 32)
goto error;
vhci_hcd->port_status[rhport] &= ~(1 << wValue);
break;
+ default:
+ /* Disallow INDICATOR and C_OVER_CURRENT */
+ usbip_dbg_vhci_rh(" ClearPortFeature: default %x\n",
+ wValue);
+ goto error;
}
break;
case GetHubDescriptor:
@@ -587,6 +598,14 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
/* 50msec reset signaling */
vhci_hcd->re_timeout = jiffies + msecs_to_jiffies(50);
fallthrough;
+ case USB_PORT_FEAT_C_CONNECTION:
+ case USB_PORT_FEAT_C_RESET:
+ case USB_PORT_FEAT_C_ENABLE:
+ case USB_PORT_FEAT_C_SUSPEND:
+ /* Not allowed for USB-3, and ignored for USB-2 */
+ if (hcd->speed == HCD_USB3)
+ goto error;
+ break;
default:
usbip_dbg_vhci_rh(" SetPortFeature: default %d\n",
wValue);
--
2.25.1