public inbox for linux-wireless@vger.kernel.org
 help / color / mirror / Atom feed
From: Ping-Ke Shih <pkshih@realtek.com>
To: Deren Wu <deren.wu@mediatek.com>, Felix Fietkau <nbd@nbd.name>,
	"Lorenzo Bianconi" <lorenzo@kernel.org>
Cc: Sean Wang <sean.wang@mediatek.com>,
	Soul Huang <Soul.Huang@mediatek.com>,
	Ming Yen Hsieh <mingyen.hsieh@mediatek.com>,
	Leon Yen <Leon.Yen@mediatek.com>,
	Eric-SY Chang <Eric-SY.Chang@mediatek.com>,
	KM Lin <km.lin@mediatek.com>,
	Robin Chiu <robin.chiu@mediatek.com>,
	CH Yeh <ch.yeh@mediatek.com>, Posh Sun <posh.sun@mediatek.com>,
	Quan Zhou <quan.zhou@mediatek.com>,
	Ryder Lee <ryder.lee@mediatek.com>,
	Shayne Chen <shayne.chen@mediatek.com>,
	linux-wireless <linux-wireless@vger.kernel.org>,
	linux-mediatek <linux-mediatek@lists.infradead.org>
Subject: RE: [PATCH 1/2] wifi: mt76: mt7921e: fix use-after-free in free_irq()
Date: Mon, 15 Jan 2024 02:03:54 +0000	[thread overview]
Message-ID: <3a3fc58206ec436e8cdfd97d71350795@realtek.com> (raw)
In-Reply-To: <572d6af305a09fc8bdd96a8ee57399039803a2bb.1705135817.git.deren.wu@mediatek.com>



> -----Original Message-----
> From: Deren Wu <deren.wu@mediatek.com>
> Sent: Saturday, January 13, 2024 5:00 PM
> To: Felix Fietkau <nbd@nbd.name>; Lorenzo Bianconi <lorenzo@kernel.org>
> Cc: Sean Wang <sean.wang@mediatek.com>; Soul Huang <Soul.Huang@mediatek.com>; Ming Yen Hsieh
> <mingyen.hsieh@mediatek.com>; Leon Yen <Leon.Yen@mediatek.com>; Eric-SY Chang
> <Eric-SY.Chang@mediatek.com>; KM Lin <km.lin@mediatek.com>; Robin Chiu <robin.chiu@mediatek.com>; CH Yeh
> <ch.yeh@mediatek.com>; Posh Sun <posh.sun@mediatek.com>; Quan Zhou <quan.zhou@mediatek.com>; Ryder Lee
> <ryder.lee@mediatek.com>; Shayne Chen <shayne.chen@mediatek.com>; linux-wireless
> <linux-wireless@vger.kernel.org>; linux-mediatek <linux-mediatek@lists.infradead.org>; Deren Wu
> <deren.wu@mediatek.com>
> Subject: [PATCH 1/2] wifi: mt76: mt7921e: fix use-after-free in free_irq()
> 
> From commit a304e1b82808 ("[PATCH] Debug shared irqs"), there is a test
> to make sure the shared irq handler should be able to handle the unexpected
> event after deregistration. For this case, let's apply MT76_REMOVED flag to
> indicate the device was removed and do not run into the resource access
> anymore.
> 
> BUG: KASAN: use-after-free in mt7921_irq_handler+0xd8/0x100 [mt7921e]
> Read of size 8 at addr ffff88824a7d3b78 by task rmmod/11115
> CPU: 28 PID: 11115 Comm: rmmod Tainted: G        W    L    5.17.0 #10
> Hardware name: Micro-Star International Co., Ltd. MS-7D73/MPG B650I
> EDGE WIFI (MS-7D73), BIOS 1.81 01/05/2024
> Call Trace:
>  <TASK>
>  dump_stack_lvl+0x6f/0xa0
>  print_address_description.constprop.0+0x1f/0x190
>  ? mt7921_irq_handler+0xd8/0x100 [mt7921e]
>  ? mt7921_irq_handler+0xd8/0x100 [mt7921e]
>  kasan_report.cold+0x7f/0x11b
>  ? mt7921_irq_handler+0xd8/0x100 [mt7921e]
>  mt7921_irq_handler+0xd8/0x100 [mt7921e]
>  free_irq+0x627/0xaa0
>  devm_free_irq+0x94/0xd0
>  ? devm_request_any_context_irq+0x160/0x160
>  ? kobject_put+0x18d/0x4a0
>  mt7921_pci_remove+0x153/0x190 [mt7921e]
>  pci_device_remove+0xa2/0x1d0
>  __device_release_driver+0x346/0x6e0
>  driver_detach+0x1ef/0x2c0
>  bus_remove_driver+0xe7/0x2d0
>  ? __check_object_size+0x57/0x310
>  pci_unregister_driver+0x26/0x250
>  __do_sys_delete_module+0x307/0x510
>  ? free_module+0x6a0/0x6a0
>  ? fpregs_assert_state_consistent+0x4b/0xb0
>  ? rcu_read_lock_sched_held+0x10/0x70
>  ? syscall_enter_from_user_mode+0x20/0x70
>  ? trace_hardirqs_on+0x1c/0x130
>  do_syscall_64+0x5c/0x80
>  ? trace_hardirqs_on_prepare+0x72/0x160
>  ? do_syscall_64+0x68/0x80
>  ? trace_hardirqs_on_prepare+0x72/0x160
>  entry_SYSCALL_64_after_hwframe+0x44/0xae
> 
> Reported-by: Mikhail Gavrilov <mikhail.v.gavrilov@gmail.com>
> Closes:
> https://lore.kernel.org/linux-wireless/CABXGCsOdvVwdLmSsC8TZ1jF0UOg_F_W3wqLECWX620PUkvNk=A@mail.gmail.
> com/
> Fixes: 9270270d6219 ("wifi: mt76: mt7921: fix PCI DMA hang after reboot")
> Tested-by: Mikhail Gavrilov <mikhail.v.gavrilov@gmail.com>
> Signed-off-by: Deren Wu <deren.wu@mediatek.com>
> ---
>  drivers/net/wireless/mediatek/mt76/mt7921/pci.c | 1 +
>  drivers/net/wireless/mediatek/mt76/mt792x_dma.c | 2 ++
>  2 files changed, 3 insertions(+)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
> b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
> index 57903c6e4f11..2f04d6658b6b 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
> @@ -387,6 +387,7 @@ static void mt7921_pci_remove(struct pci_dev *pdev)
>         struct mt792x_dev *dev = container_of(mdev, struct mt792x_dev, mt76);
> 
>         mt7921e_unregister_device(dev);
> +       set_bit(MT76_REMOVED, &mdev->phy.state);

Can it do below like mt7921_pci_suspend() to safely stop interrupt handler?
Instead of setting a flag. 

        synchronize_irq(pdev->irq);
        tasklet_kill(&mdev->irq_tasklet);


>         devm_free_irq(&pdev->dev, pdev->irq, dev);
>         mt76_free_device(&dev->mt76);
>         pci_free_irq_vectors(pdev);
> diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
> b/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
> index 488326ce5ed4..3893dbe866fe 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt792x_dma.c
> @@ -12,6 +12,8 @@ irqreturn_t mt792x_irq_handler(int irq, void *dev_instance)
>  {
>         struct mt792x_dev *dev = dev_instance;
> 

If PCI is removed, is it still safe to access 'dev_instance'?

> +       if (test_bit(MT76_REMOVED, &dev->mt76.phy.state))
> +               return IRQ_NONE;
>         mt76_wr(dev, dev->irq_map->host_irq_enable, 0);
> 
>         if (!test_bit(MT76_STATE_INITIALIZED, &dev->mphy.state))
> --
> 2.18.0
> 


  parent reply	other threads:[~2024-01-15  2:04 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-13  9:00 [PATCH 1/2] wifi: mt76: mt7921e: fix use-after-free in free_irq() Deren Wu
2024-01-13  9:00 ` [PATCH 2/2] wifi: mt76: mt7925e: " Deren Wu
2024-01-15  2:03 ` Ping-Ke Shih [this message]
2024-01-15 12:18   ` [PATCH 1/2] wifi: mt76: mt7921e: " Deren Wu (武德仁)
2024-01-16  1:25     ` Ping-Ke Shih

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=3a3fc58206ec436e8cdfd97d71350795@realtek.com \
    --to=pkshih@realtek.com \
    --cc=Eric-SY.Chang@mediatek.com \
    --cc=Leon.Yen@mediatek.com \
    --cc=Soul.Huang@mediatek.com \
    --cc=ch.yeh@mediatek.com \
    --cc=deren.wu@mediatek.com \
    --cc=km.lin@mediatek.com \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=lorenzo@kernel.org \
    --cc=mingyen.hsieh@mediatek.com \
    --cc=nbd@nbd.name \
    --cc=posh.sun@mediatek.com \
    --cc=quan.zhou@mediatek.com \
    --cc=robin.chiu@mediatek.com \
    --cc=ryder.lee@mediatek.com \
    --cc=sean.wang@mediatek.com \
    --cc=shayne.chen@mediatek.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