From: Brooke Basile <brookebasile@gmail.com>
To: kvalo@codeaurora.org, davem@davemloft.net, kuba@kernel.org
Cc: gregkh@linuxfoundation.org, linux-wireless@vger.kernel.org,
linux-kernel@vger.kernel.org, ath9k-devel@qca.qualcomm.com,
syzkaller-bugs@googlegroups.com,
syzbot+89bd486af9427a9fc605@syzkaller.appspotmail.com
Subject: Re: [PATCH] wireless: ath9k: hif_usb: fix race condition between usb_get_urb() and usb_kill_anchored_urbs()
Date: Sat, 19 Sep 2020 22:03:33 -0400 [thread overview]
Message-ID: <535351e1-90e3-ceb6-3d0a-a445a6d9582c@gmail.com> (raw)
In-Reply-To: <20200911071427.32354-1-brookebasile@gmail.com>
On 9/11/20 3:14 AM, Brooke Basile wrote:
> Calls to usb_kill_anchored_urbs() after usb_kill_urb() on multiprocessor
> systems create a race condition in which usb_kill_anchored_urbs() deallocates
> the URB before the completer callback is called in usb_kill_urb(), resulting
> in a use-after-free.
> To fix this, add proper lock protection to usb_kill_urb() calls that can
> possibly run concurrently with usb_kill_anchored_urbs().
>
> Reported-by: syzbot+89bd486af9427a9fc605@syzkaller.appspotmail.com
> Link: https://syzkaller.appspot.com/bug?id=cabffad18eb74197f84871802fd2c5117b61febf
> Signed-off-by: Brooke Basile <brookebasile@gmail.com>
> ---
> drivers/net/wireless/ath/ath9k/hif_usb.c | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
> index 3f563e02d17d..2ed98aaed6fb 100644
> --- a/drivers/net/wireless/ath/ath9k/hif_usb.c
> +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
> @@ -449,10 +449,19 @@ static void hif_usb_stop(void *hif_handle)
> spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
>
> /* The pending URBs have to be canceled. */
> + spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);
> list_for_each_entry_safe(tx_buf, tx_buf_tmp,
> &hif_dev->tx.tx_pending, list) {
> + usb_get_urb(tx_buf->urb);
> + spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
> usb_kill_urb(tx_buf->urb);
> + list_del(&tx_buf->list);
> + usb_free_urb(tx_buf->urb);
> + kfree(tx_buf->buf);
> + kfree(tx_buf);
> + spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);
> }
> + spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
>
> usb_kill_anchored_urbs(&hif_dev->mgmt_submitted);
> }
> @@ -762,27 +771,37 @@ static void ath9k_hif_usb_dealloc_tx_urbs(struct hif_device_usb *hif_dev)
> struct tx_buf *tx_buf = NULL, *tx_buf_tmp = NULL;
> unsigned long flags;
>
> + spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);
> list_for_each_entry_safe(tx_buf, tx_buf_tmp,
> &hif_dev->tx.tx_buf, list) {
> + usb_get_urb(tx_buf->urb);
> + spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
> usb_kill_urb(tx_buf->urb);
> list_del(&tx_buf->list);
> usb_free_urb(tx_buf->urb);
> kfree(tx_buf->buf);
> kfree(tx_buf);
> + spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);
> }
> + spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
>
> spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);
> hif_dev->tx.flags |= HIF_USB_TX_FLUSH;
> spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
>
> + spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);
> list_for_each_entry_safe(tx_buf, tx_buf_tmp,
> &hif_dev->tx.tx_pending, list) {
> + usb_get_urb(tx_buf->urb);
> + spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
> usb_kill_urb(tx_buf->urb);
> list_del(&tx_buf->list);
> usb_free_urb(tx_buf->urb);
> kfree(tx_buf->buf);
> kfree(tx_buf);
> + spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);
> }
> + spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
>
> usb_kill_anchored_urbs(&hif_dev->mgmt_submitted);
> }
> --
> 2.28.0
>
Hi,
Just wanted to check on the status of this patch, if there's anything
wrong I'm happy to make it right.
Sorry to bother!
Best,
Brooke Basile
next prev parent reply other threads:[~2020-09-20 2:03 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-11 7:14 [PATCH] wireless: ath9k: hif_usb: fix race condition between usb_get_urb() and usb_kill_anchored_urbs() Brooke Basile
2020-09-20 2:03 ` Brooke Basile [this message]
2020-09-21 13:05 ` Kalle Valo
[not found] ` <20200921130559.005D8C43382@smtp.codeaurora.org>
2020-09-21 23:04 ` Brooke Basile
2021-03-30 19:36 ` Memory leak in ath9k_hif_usb_dealloc_tx_urbs() Pavel Skripkin
2021-03-31 6:28 ` Greg KH
2021-04-27 11:35 ` Atul Gopinathan
2021-04-27 11:50 ` Greg KH
2021-04-27 12:04 ` Pavel Skripkin
2021-04-27 12:29 ` Pavel Skripkin
2021-04-27 13:01 ` Atul Gopinathan
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=535351e1-90e3-ceb6-3d0a-a445a6d9582c@gmail.com \
--to=brookebasile@gmail.com \
--cc=ath9k-devel@qca.qualcomm.com \
--cc=davem@davemloft.net \
--cc=gregkh@linuxfoundation.org \
--cc=kuba@kernel.org \
--cc=kvalo@codeaurora.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=syzbot+89bd486af9427a9fc605@syzkaller.appspotmail.com \
--cc=syzkaller-bugs@googlegroups.com \
/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 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).