Re: [syzbot] WARNING in vmk80xx_auto_attach/usb_submit_urb

From: syzbot
Date: Fri Apr 05 2024 - 09:30:45 EST


> Refactor endpoint checks to ensure there is no ambivalence
> about endpoint types.
>
> Try a specific branch to mitigate unrelated issues with boot/build.
>
> #syz test git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git 4090fa373f0e763c43610853>

"4090fa373f0e763c43610853>" does not look like a valid git branch or commit.

> ---
> drivers/comedi/drivers/vmk80xx.c | 35 ++++++++++++-----------------------
> 1 file changed, 12 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/comedi/drivers/vmk80xx.c b/drivers/comedi/drivers/vmk80xx.c
> index 4536ed43f65b..476885403c61 100644
> --- a/drivers/comedi/drivers/vmk80xx.c
> +++ b/drivers/comedi/drivers/vmk80xx.c
> @@ -641,33 +641,22 @@ static int vmk80xx_find_usb_endpoints(struct comedi_device *dev)
> struct vmk80xx_private *devpriv = dev->private;
> struct usb_interface *intf = comedi_to_usb_interface(dev);
> struct usb_host_interface *iface_desc = intf->cur_altsetting;
> - struct usb_endpoint_descriptor *ep_desc;
> - int i;
> + struct usb_endpoint_descriptor *ep_rx_desc, *ep_tx_desc;
> + int i, ret;
>
> - if (iface_desc->desc.bNumEndpoints != 2)
> - return -ENODEV;
> -
> - for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) {
> - ep_desc = &iface_desc->endpoint[i].desc;
> -
> - if (usb_endpoint_is_int_in(ep_desc) ||
> - usb_endpoint_is_bulk_in(ep_desc)) {
> - if (!devpriv->ep_rx)
> - devpriv->ep_rx = ep_desc;
> - continue;
> - }
> -
> - if (usb_endpoint_is_int_out(ep_desc) ||
> - usb_endpoint_is_bulk_out(ep_desc)) {
> - if (!devpriv->ep_tx)
> - devpriv->ep_tx = ep_desc;
> - continue;
> - }
> - }
> + if (devpriv->model == VMK8061_MODEL)
> + ret = usb_find_common_endpoints(iface_desc, &ep_rx_desc,
> + &ep_tx_desc, NULL, NULL);
> + else
> + ret = usb_find_common_endpoints(iface_desc, NULL, NULL,
> + &ep_rx_desc, &ep_tx_desc);
>
> - if (!devpriv->ep_rx || !devpriv->ep_tx)
> + if (ret)
> return -ENODEV;
>
> + devpriv->ep_rx = ep_rx_desc;
> + devpriv->ep_tx = ep_tx_desc;
> +
> if (!usb_endpoint_maxp(devpriv->ep_rx) || !usb_endpoint_maxp(devpriv->ep_tx))
> return -EINVAL;
>