All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: Jia-Ju Bai <baijiaju1990@gmail.com>
Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: r8a66597: Fix a possible concurrency use-after-free bug in r8a66597_endpoint_disable()
Date: Tue, 18 Dec 2018 12:11:49 +0100	[thread overview]
Message-ID: <20181218111149.GA979@kroah.com> (raw)

On Tue, Dec 18, 2018 at 06:00:20PM +0800, Jia-Ju Bai wrote:
> The function r8a66597_endpoint_disable() and r8a66597_urb_enqueue() may
> be concurrently executed.
> The two functions both access a possible shared variable "hep->hcpriv".
> 
> This shared variable is freed by r8a66597_endpoint_disable() via the
> call path:
> r8a66597_endpoint_disable
>   kfree(hep->hcpriv) (line 1995 in Linux-4.19)
> 
> This variable is read by r8a66597_urb_enqueue() via the call path:
> r8a66597_urb_enqueue
>   spin_lock_irqsave(&r8a66597->lock);
>   init_pipe_info
>     enable_r8a66597_pipe
>       pipe = hep->hcpriv (line 802 in Linux-4.19)
> 
> The read operation is protected by a spinlock, but the free operation
> is not protected by this spinlock, thus a concurrency use-after-free bug
> may occur.
> 
> To fix this bug, the spin-lock and spin-unlock function calls in
> r8a66597_endpoint_disable() are moved to protect the free operation.
> 
> Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com>
> ---
>  drivers/usb/host/r8a66597-hcd.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c
> index 984892dd72f5..1495ce14ad22 100644
> --- a/drivers/usb/host/r8a66597-hcd.c
> +++ b/drivers/usb/host/r8a66597-hcd.c
> @@ -1991,13 +1991,14 @@ static void r8a66597_endpoint_disable(struct usb_hcd *hcd,
>  		return;
>  	pipenum = pipe->info.pipenum;
>  
> +	spin_lock_irqsave(&r8a66597->lock, flags);

Don't you also need the __aquires/__releases markings on this function
in order to properly annotate it, like the rest of the driver has?

Otherwise this seems to look good to me.

thanks,

greg k-h

WARNING: multiple messages have this Message-ID (diff)
From: Greg KH <gregkh@linuxfoundation.org>
To: Jia-Ju Bai <baijiaju1990@gmail.com>
Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] r8a66597: Fix a possible concurrency use-after-free bug in r8a66597_endpoint_disable()
Date: Tue, 18 Dec 2018 12:11:49 +0100	[thread overview]
Message-ID: <20181218111149.GA979@kroah.com> (raw)
In-Reply-To: <20181218100020.26250-1-baijiaju1990@gmail.com>

On Tue, Dec 18, 2018 at 06:00:20PM +0800, Jia-Ju Bai wrote:
> The function r8a66597_endpoint_disable() and r8a66597_urb_enqueue() may
> be concurrently executed.
> The two functions both access a possible shared variable "hep->hcpriv".
> 
> This shared variable is freed by r8a66597_endpoint_disable() via the
> call path:
> r8a66597_endpoint_disable
>   kfree(hep->hcpriv) (line 1995 in Linux-4.19)
> 
> This variable is read by r8a66597_urb_enqueue() via the call path:
> r8a66597_urb_enqueue
>   spin_lock_irqsave(&r8a66597->lock);
>   init_pipe_info
>     enable_r8a66597_pipe
>       pipe = hep->hcpriv (line 802 in Linux-4.19)
> 
> The read operation is protected by a spinlock, but the free operation
> is not protected by this spinlock, thus a concurrency use-after-free bug
> may occur.
> 
> To fix this bug, the spin-lock and spin-unlock function calls in
> r8a66597_endpoint_disable() are moved to protect the free operation.
> 
> Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com>
> ---
>  drivers/usb/host/r8a66597-hcd.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c
> index 984892dd72f5..1495ce14ad22 100644
> --- a/drivers/usb/host/r8a66597-hcd.c
> +++ b/drivers/usb/host/r8a66597-hcd.c
> @@ -1991,13 +1991,14 @@ static void r8a66597_endpoint_disable(struct usb_hcd *hcd,
>  		return;
>  	pipenum = pipe->info.pipenum;
>  
> +	spin_lock_irqsave(&r8a66597->lock, flags);

Don't you also need the __aquires/__releases markings on this function
in order to properly annotate it, like the rest of the driver has?

Otherwise this seems to look good to me.

thanks,

greg k-h

             reply	other threads:[~2018-12-18 11:11 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-18 11:11 Greg Kroah-Hartman [this message]
2018-12-18 11:11 ` [PATCH] r8a66597: Fix a possible concurrency use-after-free bug in r8a66597_endpoint_disable() Greg KH
  -- strict thread matches above, loose matches on Subject: below --
2018-12-18 11:53 Jia-Ju Bai
2018-12-18 11:53 ` [PATCH] " Jia-Ju Bai
2018-12-18 10:00 Jia-Ju Bai
2018-12-18 10:00 ` [PATCH] " Jia-Ju Bai

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=20181218111149.GA979@kroah.com \
    --to=gregkh@linuxfoundation.org \
    --cc=baijiaju1990@gmail.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.