LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
To: Jerome Brunet <jbrunet@baylibre.com>,
Felipe Balbi <balbi@kernel.org>,
Ruslan Bilovol <ruslan.bilovol@gmail.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jack Pham <jackp@codeaurora.org>,
"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Subject: Re: [PATCH] usb: gadget: u_audio: fix race condition on endpoint stop
Date: Fri, 27 Aug 2021 23:59:43 +0000 [thread overview]
Message-ID: <3c62d031-7334-3984-e002-f3eef1fa3b3b@synopsys.com> (raw)
In-Reply-To: <20210827092927.366482-1-jbrunet@baylibre.com>
Jerome Brunet wrote:
> If the endpoint completion callback is call right after the ep_enabled flag
> is cleared and before usb_ep_dequeue() is call, we could do a double free
> on the request and the associated buffer.
>
> Fix this by clearing ep_enabled after all the endpoint requests have been
> dequeued.
>
> Fixes: 7de8681be2cd ("usb: gadget: u_audio: Free requests only after callback")
> Reported-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
> ---
> drivers/usb/gadget/function/u_audio.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/usb/gadget/function/u_audio.c b/drivers/usb/gadget/function/u_audio.c
> index 63d9340f008e..9e5c950612d0 100644
> --- a/drivers/usb/gadget/function/u_audio.c
> +++ b/drivers/usb/gadget/function/u_audio.c
> @@ -394,8 +394,6 @@ static inline void free_ep(struct uac_rtd_params *prm, struct usb_ep *ep)
> if (!prm->ep_enabled)
> return;
>
> - prm->ep_enabled = false;
> -
> audio_dev = uac->audio_dev;
> params = &audio_dev->params;
>
> @@ -413,6 +411,8 @@ static inline void free_ep(struct uac_rtd_params *prm, struct usb_ep *ep)
> }
> }
>
> + prm->ep_enabled = false;
> +
Hm... this looks a little odd. If the cancelled request completes before
prm->ep_enabled = false, then the audio driver will re-queue the
request. It will eventually be freed later when the endpoint is disabled
and when the controller driver completes and gives back any outstanding
request. But is this what you intended? If it is, why even usb_ep_dequeue()?
Also, another concern I have is I don't see any lock or memory barrier
when writing/reading prm->ep_enabled. Are we always reading
prm->ep_enabled in the right order as we expected?
Would it be simpler to free the request base on the request completion
status as suggested?
BR,
Thinh
> if (usb_ep_disable(ep))
> dev_err(uac->card->dev, "%s:%d Error!\n", __func__, __LINE__);
> }
> @@ -424,8 +424,6 @@ static inline void free_ep_fback(struct uac_rtd_params *prm, struct usb_ep *ep)
> if (!prm->fb_ep_enabled)
> return;
>
> - prm->fb_ep_enabled = false;
> -
> if (prm->req_fback) {
> if (usb_ep_dequeue(ep, prm->req_fback)) {
> kfree(prm->req_fback->buf);
> @@ -434,6 +432,8 @@ static inline void free_ep_fback(struct uac_rtd_params *prm, struct usb_ep *ep)
> prm->req_fback = NULL;
> }
>
> + prm->fb_ep_enabled = false;
> +
> if (usb_ep_disable(ep))
> dev_err(uac->card->dev, "%s:%d Error!\n", __func__, __LINE__);
> }
>
next prev parent reply other threads:[~2021-08-27 23:59 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-27 9:29 Jerome Brunet
2021-08-27 23:59 ` Thinh Nguyen [this message]
2021-08-30 9:10 ` Jerome Brunet
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=3c62d031-7334-3984-e002-f3eef1fa3b3b@synopsys.com \
--to=thinh.nguyen@synopsys.com \
--cc=balbi@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=jackp@codeaurora.org \
--cc=jbrunet@baylibre.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=ruslan.bilovol@gmail.com \
--subject='Re: [PATCH] usb: gadget: u_audio: fix race condition on endpoint stop' \
/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
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).