On Thu, Apr 11, 2019 at 12:54:12PM +0800, Young Xiao wrote: > From: Young Xiao <YangX92@xxxxxxxxxxx> > > The driver expects at least one valid endpoint. If given > malicious descriptors that specify 0 for the number of endpoints, > it will crash in the probe function. Ensure there is at least > one endpoint on the interface before using it. Why do claim it will crash? > This vulnerability is same as CVE-2016-2188. Note that the "fix" for this CVE that you're now copying was incomplete. Here's the proper fix: b7321e81fc36 ("USB: iowarrior: fix NULL-deref at probe") > Signed-off-by: Young Xiao <YangX92@xxxxxxxxxxx> > --- > drivers/media/usb/s2255/s2255drv.c | 7 +++++++ > drivers/media/usb/stkwebcam/stk-webcam.c | 6 ++++++ > 2 files changed, 13 insertions(+) > > diff --git a/drivers/media/usb/s2255/s2255drv.c b/drivers/media/usb/s2255/s2255drv.c > index 5b3e54b..7fdf159 100644 > --- a/drivers/media/usb/s2255/s2255drv.c > +++ b/drivers/media/usb/s2255/s2255drv.c > @@ -2263,6 +2263,13 @@ static int s2255_probe(struct usb_interface *interface, > iface_desc = interface->cur_altsetting; > dev_dbg(&interface->dev, "num EP: %d\n", > iface_desc->desc.bNumEndpoints); > + > + if (iface_desc->desc.bNumEndpoints < 1) { > + dev_err(&interface->dev, "Invalid number of endpoints\n"); > + retval = -EINVAL; > + goto error; > + } > + > for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { Besides that you didn't even bother compile-testing this, there is no bug here to fix to begin with. If bNumEndpoints is zero this loop will execute and the driver bails out just after since dev->read_endpoint is NULL. > endpoint = &iface_desc->endpoint[i].desc; > if (!dev->read_endpoint && usb_endpoint_is_bulk_in(endpoint)) { > diff --git a/drivers/media/usb/stkwebcam/stk-webcam.c b/drivers/media/usb/stkwebcam/stk-webcam.c > index 8f54586..d2a4785 100644 > --- a/drivers/media/usb/stkwebcam/stk-webcam.c > +++ b/drivers/media/usb/stkwebcam/stk-webcam.c > @@ -1350,6 +1350,12 @@ static int stk_camera_probe(struct usb_interface *interface, > * for the current alternate setting */ > iface_desc = interface->cur_altsetting; > > + if (iface_desc->desc.bNumEndpoints < 1) { > + dev_err(&interface->dev, "Invalid number of endpoints\n"); > + retval = -EINVAL; > + goto error; > + } > + > for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { Same here. > endpoint = &iface_desc->endpoint[i].desc; Johan