From: Jia-Ju Bai <baijiaju1990@gmail.com>
To: Greg KH <gregkh@linuxfoundation.org>
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 19:53:56 +0800 [thread overview]
Message-ID: <e94fc8ed-9f18-7da7-5768-e768153e1d7d@gmail.com> (raw)
On 2018/12/18 19:11, Greg KH wrote:
> 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?
Okay, thanks for this suggestion :)
I will send a v2 patch.
Best wishes,
Jia-Ju Bai
WARNING: multiple messages have this Message-ID (diff)
From: Jia-Ju Bai <baijiaju1990@gmail.com>
To: Greg KH <gregkh@linuxfoundation.org>
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 19:53:56 +0800 [thread overview]
Message-ID: <e94fc8ed-9f18-7da7-5768-e768153e1d7d@gmail.com> (raw)
In-Reply-To: <20181218111149.GA979@kroah.com>
On 2018/12/18 19:11, Greg KH wrote:
> 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?
Okay, thanks for this suggestion :)
I will send a v2 patch.
Best wishes,
Jia-Ju Bai
next reply other threads:[~2018-12-18 11:53 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-18 11:53 Jia-Ju Bai [this message]
2018-12-18 11:53 ` [PATCH] r8a66597: Fix a possible concurrency use-after-free bug in r8a66597_endpoint_disable() Jia-Ju Bai
-- strict thread matches above, loose matches on Subject: below --
2018-12-18 11:11 Greg Kroah-Hartman
2018-12-18 11:11 ` [PATCH] " Greg KH
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=e94fc8ed-9f18-7da7-5768-e768153e1d7d@gmail.com \
--to=baijiaju1990@gmail.com \
--cc=gregkh@linuxfoundation.org \
--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.