diff options
author | Heinrich Schuchardt <xypron.glpk@gmx.de> | 2018-03-29 11:48:28 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-03-29 12:37:28 -0400 |
commit | af6f8529098aeb0e56a68671b450cf74e7a64fcd (patch) | |
tree | d42d1e620633a05b2c697add92360b54c6317641 /drivers/usb | |
parent | be9cae2479f48d18f7a449ba91677ae97df11f3e (diff) |
usb: musb: gadget: misplaced out of bounds check
musb->endpoints[] has array size MUSB_C_NUM_EPS.
We must check array bounds before accessing the array and not afterwards.
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Bin Liu <b-liu@ti.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/musb/musb_gadget_ep0.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c index 18da4873e52e..91a5027b5c1f 100644 --- a/drivers/usb/musb/musb_gadget_ep0.c +++ b/drivers/usb/musb/musb_gadget_ep0.c | |||
@@ -89,15 +89,19 @@ static int service_tx_status_request( | |||
89 | } | 89 | } |
90 | 90 | ||
91 | is_in = epnum & USB_DIR_IN; | 91 | is_in = epnum & USB_DIR_IN; |
92 | if (is_in) { | 92 | epnum &= 0x0f; |
93 | epnum &= 0x0f; | 93 | if (epnum >= MUSB_C_NUM_EPS) { |
94 | handled = -EINVAL; | ||
95 | break; | ||
96 | } | ||
97 | |||
98 | if (is_in) | ||
94 | ep = &musb->endpoints[epnum].ep_in; | 99 | ep = &musb->endpoints[epnum].ep_in; |
95 | } else { | 100 | else |
96 | ep = &musb->endpoints[epnum].ep_out; | 101 | ep = &musb->endpoints[epnum].ep_out; |
97 | } | ||
98 | regs = musb->endpoints[epnum].regs; | 102 | regs = musb->endpoints[epnum].regs; |
99 | 103 | ||
100 | if (epnum >= MUSB_C_NUM_EPS || !ep->desc) { | 104 | if (!ep->desc) { |
101 | handled = -EINVAL; | 105 | handled = -EINVAL; |
102 | break; | 106 | break; |
103 | } | 107 | } |