Re: [PATCH] drivers/usb/host/imx21-hcd.c: fix divide-by-zero in func nonisoc_etd_done

From: gregkh@xxxxxxxxxxxxxxxxxxx
Date: Wed Jun 05 2019 - 05:52:24 EST


On Wed, Jun 05, 2019 at 02:02:40AM +0000, Duyanlin wrote:
>
> If the function usb_maxpacket(urb->dev, urb->pipe, usb_pipeout(urb->pipe)) returns 0, that will cause a illegal divide-by-zero operation, unexpected results may occur.
> It is best to ensure that the denominator is non-zero before dividing by zero.

Please wrap your changelog comments at 72 columns.

> Signed-off-by: Yanlin Du <duyanlin@xxxxxxxxxx>

This name HAS to match the From: line of your email. For that reason
alone I can not take this patch.

> ---
> drivers/usb/host/imx21-hcd.c | 7 ++++---
> 1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/usb/host/imx21-hcd.c b/drivers/usb/host/imx21-hcd.c index 6e3dad1..6a47f78 100644
> --- a/drivers/usb/host/imx21-hcd.c
> +++ b/drivers/usb/host/imx21-hcd.c
> @@ -1038,6 +1038,7 @@ static void nonisoc_etd_done(struct usb_hcd *hcd, int etd_num)
> int cc;
> u32 bytes_xfrd;
> int etd_done;
> + unsigned int maxp;
>
> disactivate_etd(imx21, etd_num);
>
> @@ -1104,13 +1105,13 @@ static void nonisoc_etd_done(struct usb_hcd *hcd, int etd_num)
> break;
>
> case PIPE_BULK:
> + maxp = usb_maxpacket(urb->dev, urb->pipe,
> + usb_pipeout(urb->pipe));

How can this ever be 0? Don't we abort a lot earlier if a pipe length
is 0?

thanks,

greg k-h