From: Michael Grzeschik <mgr@pengutronix.de>
To: Avichal Rakesh <arakesh@google.com>
Cc: dan.scally@ideasonboard.com, laurent.pinchart@ideasonboard.com,
etalvala@google.com, gregkh@linuxfoundation.org,
jchowdhary@google.com, linux-kernel@vger.kernel.org,
linux-usb@vger.kernel.org
Subject: Re: [PATCH v4 2/3] usb: gadget: uvc: Allocate uvc_requests one at a time
Date: Wed, 18 Oct 2023 15:03:00 +0200 [thread overview]
Message-ID: <ZS/XhFNvnevol9MP@pengutronix.de> (raw)
In-Reply-To: <20231012002451.254737-2-arakesh@google.com>
[-- Attachment #1: Type: text/plain, Size: 7556 bytes --]
A short second review.
On Wed, Oct 11, 2023 at 05:24:50PM -0700, Avichal Rakesh wrote:
>Currently, the uvc gadget driver allocates all uvc_requests as one array
>and deallocates them all when the video stream stops. This includes
>de-allocating all the usb_requests associated with those uvc_requests.
>This can lead to use-after-free issues if any of those de-allocated
>usb_requests were still owned by the usb controller.
>
>This patch is 1 of 2 patches addressing the use-after-free issue.
>Instead of bulk allocating all uvc_requests as an array, this patch
>allocates uvc_requests one at a time, which should allows for similar
>granularity when deallocating the uvc_requests. This patch has no
>functional changes other than allocating each uvc_request separately,
>and similarly freeing each of them separately.
>
>Link: https://lore.kernel.org/7cd81649-2795-45b6-8c10-b7df1055020d@google.com
>Suggested-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
>Reviewed-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
>Signed-off-by: Avichal Rakesh <arakesh@google.com>
>---
>v1 -> v2: Rebased to ToT
>v2 -> v3: Fix email threading goof-up
>v3 -> v4: Address review comments & re-rebase to ToT
>
> drivers/usb/gadget/function/uvc.h | 3 +-
> drivers/usb/gadget/function/uvc_video.c | 87 ++++++++++++++-----------
> 2 files changed, 50 insertions(+), 40 deletions(-)
>
>diff --git a/drivers/usb/gadget/function/uvc.h b/drivers/usb/gadget/function/uvc.h
>index 989bc6b4e93d..993694da0bbc 100644
>--- a/drivers/usb/gadget/function/uvc.h
>+++ b/drivers/usb/gadget/function/uvc.h
>@@ -81,6 +81,7 @@ struct uvc_request {
> struct sg_table sgt;
> u8 header[UVCG_REQUEST_HEADER_LEN];
> struct uvc_buffer *last_buf;
>+ struct list_head list;
> };
>
> struct uvc_video {
>@@ -102,7 +103,7 @@ struct uvc_video {
>
> /* Requests */
> unsigned int req_size;
>- struct uvc_request *ureq;
>+ struct list_head ureqs; /* all uvc_requests allocated by uvc_video */
> struct list_head req_free;
> spinlock_t req_lock;
>
>diff --git a/drivers/usb/gadget/function/uvc_video.c b/drivers/usb/gadget/function/uvc_video.c
>index c334802ac0a4..b62b3de79153 100644
>--- a/drivers/usb/gadget/function/uvc_video.c
>+++ b/drivers/usb/gadget/function/uvc_video.c
>@@ -227,6 +227,24 @@ uvc_video_encode_isoc(struct usb_request *req, struct uvc_video *video,
> * Request handling
> */
>
>+static void
>+uvc_video_free_request(struct uvc_request *ureq, struct usb_ep *ep)
>+{
>+ sg_free_table(&ureq->sgt);
>+ if (ureq->req && ep) {
>+ usb_ep_free_request(ep, ureq->req);
>+ ureq->req = NULL;
>+ }
>+
>+ kfree(ureq->req_buffer);
>+ ureq->req_buffer = NULL;
>+
>+ if (!list_empty(&ureq->list))
>+ list_del_init(&ureq->list);
>+
>+ kfree(ureq);
>+}
>+
> static int uvcg_video_ep_queue(struct uvc_video *video, struct usb_request *req)
> {
> int ret;
>@@ -293,27 +311,12 @@ uvc_video_complete(struct usb_ep *ep, struct usb_request *req)
> static int
> uvc_video_free_requests(struct uvc_video *video)
> {
>- unsigned int i;
>+ struct uvc_request *ureq, *temp;
>
>- if (video->ureq) {
>- for (i = 0; i < video->uvc_num_requests; ++i) {
>- sg_free_table(&video->ureq[i].sgt);
>-
>- if (video->ureq[i].req) {
>- usb_ep_free_request(video->ep, video->ureq[i].req);
>- video->ureq[i].req = NULL;
>- }
>-
>- if (video->ureq[i].req_buffer) {
>- kfree(video->ureq[i].req_buffer);
>- video->ureq[i].req_buffer = NULL;
>- }
>- }
>-
>- kfree(video->ureq);
>- video->ureq = NULL;
>- }
>+ list_for_each_entry_safe(ureq, temp, &video->ureqs, list)
>+ uvc_video_free_request(ureq, video->ep);
>
>+ INIT_LIST_HEAD(&video->ureqs);
> INIT_LIST_HEAD(&video->req_free);
> video->req_size = 0;
> return 0;
>@@ -322,6 +325,7 @@ uvc_video_free_requests(struct uvc_video *video)
> static int
> uvc_video_alloc_requests(struct uvc_video *video)
> {
>+ struct uvc_request *ureq;
> unsigned int req_size;
> unsigned int i;
> int ret = -ENOMEM;
>@@ -332,29 +336,32 @@ uvc_video_alloc_requests(struct uvc_video *video)
> * max_t(unsigned int, video->ep->maxburst, 1)
> * (video->ep->mult);
>
>- video->ureq = kcalloc(video->uvc_num_requests, sizeof(struct uvc_request), GFP_KERNEL);
>- if (video->ureq == NULL)
>- return -ENOMEM;
>+ INIT_LIST_HEAD(&video->ureqs);
>+ for (i = 0; i < video->uvc_num_requests; i++) {
>+ ureq = kzalloc(sizeof(struct uvc_request), GFP_KERNEL);
>+ if (ureq == NULL)
>+ goto error;
Please add an empty line here.
>+ INIT_LIST_HEAD(&ureq->list);
Please add an empty line here.
>+ list_add_tail(&ureq->list, &video->ureqs);
>
>- for (i = 0; i < video->uvc_num_requests; ++i) {
>- video->ureq[i].req_buffer = kmalloc(req_size, GFP_KERNEL);
>- if (video->ureq[i].req_buffer == NULL)
>+ ureq->req_buffer = kmalloc(req_size, GFP_KERNEL);
>+ if (ureq->req_buffer == NULL)
You could also use if (!ureq->req_buffer)
> goto error;
>
>- video->ureq[i].req = usb_ep_alloc_request(video->ep, GFP_KERNEL);
>- if (video->ureq[i].req == NULL)
>+ ureq->req = usb_ep_alloc_request(video->ep, GFP_KERNEL);
>+ if (ureq->req == NULL)
> goto error;
>
>- video->ureq[i].req->buf = video->ureq[i].req_buffer;
>- video->ureq[i].req->length = 0;
>- video->ureq[i].req->complete = uvc_video_complete;
>- video->ureq[i].req->context = &video->ureq[i];
>- video->ureq[i].video = video;
>- video->ureq[i].last_buf = NULL;
>+ ureq->req->buf = ureq->req_buffer;
>+ ureq->req->length = 0;
>+ ureq->req->complete = uvc_video_complete;
>+ ureq->req->context = ureq;
>+ ureq->video = video;
>+ ureq->last_buf = NULL;
>
>- list_add_tail(&video->ureq[i].req->list, &video->req_free);
>+ list_add_tail(&ureq->req->list, &video->req_free);
> /* req_size/PAGE_SIZE + 1 for overruns and + 1 for header */
>- sg_alloc_table(&video->ureq[i].sgt,
>+ sg_alloc_table(&ureq->sgt,
> DIV_ROUND_UP(req_size - UVCG_REQUEST_HEADER_LEN,
> PAGE_SIZE) + 2, GFP_KERNEL);
> }
>@@ -489,8 +496,8 @@ static void uvcg_video_pump(struct work_struct *work)
> */
> int uvcg_video_enable(struct uvc_video *video, int enable)
> {
>- unsigned int i;
> int ret;
>+ struct uvc_request *ureq;
>
> if (video->ep == NULL) {
> uvcg_info(&video->uvc->func,
>@@ -502,9 +509,10 @@ int uvcg_video_enable(struct uvc_video *video, int enable)
> cancel_work_sync(&video->pump);
> uvcg_queue_cancel(&video->queue, 0);
>
>- for (i = 0; i < video->uvc_num_requests; ++i)
>- if (video->ureq && video->ureq[i].req)
>- usb_ep_dequeue(video->ep, video->ureq[i].req);
>+ list_for_each_entry(ureq, &video->ureqs, list) {
>+ if (ureq->req)
>+ usb_ep_dequeue(video->ep, ureq->req);
>+ }
>
> uvc_video_free_requests(video);
> uvcg_queue_enable(&video->queue, 0);
>@@ -536,6 +544,7 @@ int uvcg_video_enable(struct uvc_video *video, int enable)
> */
> int uvcg_video_init(struct uvc_video *video, struct uvc_device *uvc)
> {
>+ INIT_LIST_HEAD(&video->ureqs);
> INIT_LIST_HEAD(&video->req_free);
> spin_lock_init(&video->req_lock);
> INIT_WORK(&video->pump, uvcg_video_pump);
>--
>2.42.0.609.gbb76f46606-goog
>
>
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2023-10-18 13:03 UTC|newest]
Thread overview: 97+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-30 18:48 [PATCH v1 0/3] usb: gadget: uvc: stability fixes on STREAMOFF Avichal Rakesh
2023-09-30 18:48 ` [PATCH v1 1/3] usb: gadget: uvc: prevent use of disabled endpoint Avichal Rakesh
2023-10-03 23:18 ` [PATCH v2 " Avichal Rakesh
2023-09-30 18:48 ` [PATCH v1 2/3] usb: gadget: uvc: Allocate uvc_requests one at a time Avichal Rakesh
2023-10-03 23:19 ` [PATCH v2 " Avichal Rakesh
2023-09-30 18:48 ` [PATCH v1 3/3] usb: gadget: uvc: Fix use-after-free for inflight usb_requests Avichal Rakesh
2023-10-03 23:21 ` [PATCH v2 " Avichal Rakesh
2023-10-03 11:09 ` [PATCH v1 0/3] usb: gadget: uvc: stability fixes on STREAMOFF Michael Grzeschik
2023-10-03 23:16 ` Avichal Rakesh
2023-10-05 7:11 ` Greg Kroah-Hartman
2023-10-05 18:09 ` Avichal Rakesh
2023-10-05 8:23 ` Laurent Pinchart
2023-10-05 10:14 ` Michael Grzeschik
2023-10-05 18:30 ` Avichal Rakesh
2023-10-05 22:05 ` Michael Grzeschik
2023-10-06 17:00 ` Avichal Rakesh
2023-10-06 22:53 ` Michael Grzeschik
2023-10-06 23:48 ` Avichal Rakesh
2023-10-08 19:48 ` Michael Grzeschik
2023-10-12 0:33 ` Avichal Rakesh
2023-10-05 18:08 ` [PATCH v3 1/3] usb: gadget: uvc: prevent use of disabled endpoint Avichal Rakesh
2023-10-05 18:08 ` [PATCH v3 2/3] usb: gadget: uvc: Allocate uvc_requests one at a time Avichal Rakesh
2023-10-06 22:11 ` Michael Grzeschik
2023-10-05 18:08 ` [PATCH v3 3/3] usb: gadget: uvc: Fix use-after-free for inflight usb_requests Avichal Rakesh
2023-10-06 22:04 ` [PATCH v3 1/3] usb: gadget: uvc: prevent use of disabled endpoint Michael Grzeschik
2023-10-12 0:24 ` [PATCH v4 " Avichal Rakesh
2023-10-12 0:24 ` [PATCH v4 2/3] usb: gadget: uvc: Allocate uvc_requests one at a time Avichal Rakesh
2023-10-18 13:03 ` Michael Grzeschik [this message]
2023-10-18 19:53 ` Avichal Rakesh
2023-10-12 0:24 ` [PATCH v4 3/3] usb: gadget: uvc: Fix use-after-free for inflight usb_requests Avichal Rakesh
2023-10-12 0:42 ` Avichal Rakesh
2023-10-18 13:10 ` Michael Grzeschik
2023-10-18 21:50 ` Avichal Rakesh
2023-10-18 22:06 ` Michael Grzeschik
2023-10-19 18:54 ` Avichal Rakesh
2023-10-18 19:46 ` [PATCH v5 1/3] usb: gadget: uvc: prevent use of disabled endpoint Avichal Rakesh
2023-10-18 19:46 ` [PATCH v5 2/3] usb: gadget: uvc: Allocate uvc_requests one at a time Avichal Rakesh
2023-10-18 19:46 ` [PATCH v5 3/3] usb: gadget: uvc: Fix use-after-free for inflight usb_requests Avichal Rakesh
2023-10-19 18:53 ` [PATCH v6 0/4] usb: gadget: uvc: stability fixes on STREAMOFF Avichal Rakesh
2023-10-19 18:53 ` [PATCH v6 1/4] usb: gadget: uvc: prevent use of disabled endpoint Avichal Rakesh
2023-10-19 18:53 ` [PATCH v6 2/4] usb: gadget: uvc: Allocate uvc_requests one at a time Avichal Rakesh
2023-10-19 18:53 ` [PATCH v6 3/4] usb: gadget: uvc: move video disable logic to its own function Avichal Rakesh
2023-10-19 18:53 ` [PATCH v6 4/4] usb: gadget: uvc: Fix use-after-free for inflight usb_requests Avichal Rakesh
2023-10-19 20:32 ` kernel test robot
2023-10-19 22:30 ` Avichal Rakesh
2023-10-21 10:05 ` Greg KH
2023-10-23 21:25 ` Avichal Rakesh
2023-10-24 9:27 ` Greg KH
2023-10-24 20:00 ` Avichal Rakesh
2023-10-19 18:59 ` [PATCH v6 0/4] usb: gadget: uvc: stability fixes on STREAMOFF Avichal Rakesh
2023-10-27 20:19 ` [PATCH v9 1/4] usb: gadget: uvc: prevent use of disabled endpoint Avichal Rakesh
2023-10-27 20:19 ` [PATCH v9 2/4] usb: gadget: uvc: Allocate uvc_requests one at a time Avichal Rakesh
2023-10-28 10:31 ` Greg KH
2023-10-28 20:13 ` Dan Scally
2023-10-30 20:26 ` Avichal Rakesh
2023-10-27 20:19 ` [PATCH v9 3/4] usb: gadget: uvc: move video disable logic to its own function Avichal Rakesh
2023-10-28 20:16 ` Dan Scally
2023-10-27 20:19 ` [PATCH v9 4/4] usb: gadget: uvc: Fix use-after-free for inflight usb_requests Avichal Rakesh
2023-10-28 20:56 ` Dan Scally
2023-10-30 20:56 ` Avichal Rakesh
2023-11-02 13:29 ` Dan Scally
2023-11-02 20:39 ` Avichal Rakesh
2023-11-07 21:15 ` Avichal Rakesh
2023-10-30 20:22 ` [PATCH v10 1/4] usb: gadget: uvc: prevent use of disabled endpoint Avichal Rakesh
2023-10-30 20:22 ` [PATCH v10 2/4] usb: gadget: uvc: Allocate uvc_requests one at a time Avichal Rakesh
2023-11-01 11:06 ` Dan Scally
2023-11-01 22:13 ` Avichal Rakesh
2023-11-02 11:38 ` Dan Scally
2023-10-30 20:22 ` [PATCH v10 3/4] usb: gadget: uvc: move video disable logic to its own function Avichal Rakesh
2023-10-30 20:22 ` [PATCH v10 4/4] usb: gadget: uvc: Fix use-after-free for inflight usb_requests Avichal Rakesh
2023-11-02 20:19 ` [PATCH v11 1/4] usb: gadget: uvc: prevent use of disabled endpoint Avichal Rakesh
2023-11-02 20:19 ` [PATCH v11 2/4] usb: gadget: uvc: Allocate uvc_requests one at a time Avichal Rakesh
2023-11-02 20:19 ` [PATCH v11 3/4] usb: gadget: uvc: move video disable logic to its own function Avichal Rakesh
2023-11-02 20:19 ` [PATCH v11 4/4] usb: gadget: uvc: Fix use-after-free for inflight usb_requests Avichal Rakesh
2023-11-08 14:15 ` Dan Scally
2023-11-09 1:00 ` Avichal Rakesh
2023-11-09 0:41 ` [PATCH v12 1/4] usb: gadget: uvc: prevent use of disabled endpoint Avichal Rakesh
2023-11-09 0:41 ` [PATCH v12 2/4] usb: gadget: uvc: Allocate uvc_requests one at a time Avichal Rakesh
2023-11-09 0:41 ` [PATCH v12 3/4] usb: gadget: uvc: move video disable logic to its own function Avichal Rakesh
2023-11-09 0:41 ` [PATCH v12 4/4] usb: gadget: uvc: Fix use-after-free for inflight usb_requests Avichal Rakesh
2023-11-14 21:04 ` [PATCH v12 1/4] usb: gadget: uvc: prevent use of disabled endpoint Avichal Rakesh
2023-10-20 17:36 ` [PATCH v7 " Avichal Rakesh
2023-10-20 17:36 ` [PATCH v7 2/4] usb: gadget: uvc: Allocate uvc_requests one at a time Avichal Rakesh
2023-10-20 17:36 ` [PATCH v7 3/4] usb: gadget: uvc: move video disable logic to its own function Avichal Rakesh
2023-10-20 17:36 ` [PATCH v7 4/4] usb: gadget: uvc: Fix use-after-free for inflight usb_requests Avichal Rakesh
2023-10-24 18:36 ` [PATCH v8 1/4] usb: gadget: uvc: prevent use of disabled endpoint Avichal Rakesh
2023-10-24 18:36 ` [PATCH v8 2/4] usb: gadget: uvc: Allocate uvc_requests one at a time Avichal Rakesh
2023-10-27 12:57 ` Dan Scally
2023-10-27 20:31 ` Avichal Rakesh
2023-10-28 5:30 ` Greg KH
2023-10-24 18:36 ` [PATCH v8 3/4] usb: gadget: uvc: move video disable logic to its own function Avichal Rakesh
2023-10-27 12:57 ` Dan Scally
2023-10-24 18:36 ` [PATCH v8 4/4] usb: gadget: uvc: Fix use-after-free for inflight usb_requests Avichal Rakesh
2023-10-26 20:23 ` [PATCH v8 1/4] usb: gadget: uvc: prevent use of disabled endpoint Avichal Rakesh
2023-10-27 10:51 ` Greg KH
2023-10-27 10:52 ` Dan Scally
2023-10-27 12:56 ` Dan Scally
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZS/XhFNvnevol9MP@pengutronix.de \
--to=mgr@pengutronix.de \
--cc=arakesh@google.com \
--cc=dan.scally@ideasonboard.com \
--cc=etalvala@google.com \
--cc=gregkh@linuxfoundation.org \
--cc=jchowdhary@google.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.