usb: gadget: uvc: test if ep->desc is valid on ep_queue
authorMichael Grzeschik <m.grzeschik@pengutronix.de>
Sun, 17 Oct 2021 21:50:14 +0000 (23:50 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 21 Oct 2021 10:58:24 +0000 (12:58 +0200)
The reason that the ep_queue has failed could be a disabled endpoint.
In that case it is not guaranteed that the ep->desc is still valid.
This patch adds a check for NULL.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Link: https://lore.kernel.org/r/20211017215017.18392-4-m.grzeschik@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/gadget/function/uvc_video.c

index f3e97a4fc0303941322f8a4c8a627e20b72669d5..4222192fa624cb65bf63730f2f1293b2db2fd097 100644 (file)
@@ -199,9 +199,12 @@ static int uvcg_video_ep_queue(struct uvc_video *video, struct usb_request *req)
                uvcg_err(&video->uvc->func, "Failed to queue request (%d).\n",
                         ret);
 
-               /* Isochronous endpoints can't be halted. */
-               if (usb_endpoint_xfer_bulk(video->ep->desc))
-                       usb_ep_set_halt(video->ep);
+               /* If the endpoint is disabled the descriptor may be NULL. */
+               if (video->ep->desc) {
+                       /* Isochronous endpoints can't be halted. */
+                       if (usb_endpoint_xfer_bulk(video->ep->desc))
+                               usb_ep_set_halt(video->ep);
+               }
        }
 
        return ret;