This bug influences both st_nci_i2c_remove and st_nci_spi_remove.
Take st_nci_i2c_remove as an example.
In st_nci_i2c_probe, it called ndlc_probe and bound &ndlc->sm_work
with llt_ndlc_sm_work.
When it calls ndlc_recv or timeout handler, it will finally call
schedule_work to start the work.
When we call st_nci_i2c_remove to remove the driver, there
may be a sequence as follows:
Fix it by finishing the work before cleanup in ndlc_remove
CPU0 CPU1
|llt_ndlc_sm_work
st_nci_i2c_remove |
ndlc_remove |
st_nci_remove |
nci_free_device|
kfree(ndev) |
//free ndlc->ndev |
|llt_ndlc_rcv_queue
|nci_recv_frame
|//use ndlc->ndev
Fixes: 35630df68d60 ("NFC: st21nfcb: Add driver for STMicroelectronics ST21NFCB NFC chip")
Signed-off-by: Zheng Wang <[email protected]>
---
drivers/nfc/st-nci/ndlc.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/nfc/st-nci/ndlc.c b/drivers/nfc/st-nci/ndlc.c
index 755460a73c0d..d2aa9f766738 100644
--- a/drivers/nfc/st-nci/ndlc.c
+++ b/drivers/nfc/st-nci/ndlc.c
@@ -282,13 +282,15 @@ EXPORT_SYMBOL(ndlc_probe);
void ndlc_remove(struct llt_ndlc *ndlc)
{
- st_nci_remove(ndlc->ndev);
-
/* cancel timers */
del_timer_sync(&ndlc->t1_timer);
del_timer_sync(&ndlc->t2_timer);
ndlc->t2_active = false;
ndlc->t1_active = false;
+ /* cancel work */
+ cancel_work_sync(&ndlc->sm_work);
+
+ st_nci_remove(ndlc->ndev);
skb_queue_purge(&ndlc->rcv_q);
skb_queue_purge(&ndlc->send_q);
--
2.25.1
On 12/03/2023 17:08, Zheng Wang wrote:
> This bug influences both st_nci_i2c_remove and st_nci_spi_remove.
> Take st_nci_i2c_remove as an example.
>
> In st_nci_i2c_probe, it called ndlc_probe and bound &ndlc->sm_work
> with llt_ndlc_sm_work.
>
> When it calls ndlc_recv or timeout handler, it will finally call
> schedule_work to start the work.
>
> When we call st_nci_i2c_remove to remove the driver, there
> may be a sequence as follows:
>
> Fix it by finishing the work before cleanup in ndlc_remove
Reviewed-by: Krzysztof Kozlowski <[email protected]>
Best regards,
Krzysztof
Krzysztof Kozlowski <[email protected]> 于2023年3月13日周一 14:52写道:
>
> On 12/03/2023 17:08, Zheng Wang wrote:
> > This bug influences both st_nci_i2c_remove and st_nci_spi_remove.
> > Take st_nci_i2c_remove as an example.
> >
> > In st_nci_i2c_probe, it called ndlc_probe and bound &ndlc->sm_work
> > with llt_ndlc_sm_work.
> >
> > When it calls ndlc_recv or timeout handler, it will finally call
> > schedule_work to start the work.
> >
> > When we call st_nci_i2c_remove to remove the driver, there
> > may be a sequence as follows:
> >
> > Fix it by finishing the work before cleanup in ndlc_remove
>
>
> Reviewed-by: Krzysztof Kozlowski <[email protected]>
>
Thanks for the detailed review.
Best regards,
Zheng
> Best regards,
> Krzysztof
>
Hello:
This patch was applied to netdev/net.git (main)
by Jakub Kicinski <[email protected]>:
On Mon, 13 Mar 2023 00:08:37 +0800 you wrote:
> This bug influences both st_nci_i2c_remove and st_nci_spi_remove.
> Take st_nci_i2c_remove as an example.
>
> In st_nci_i2c_probe, it called ndlc_probe and bound &ndlc->sm_work
> with llt_ndlc_sm_work.
>
> When it calls ndlc_recv or timeout handler, it will finally call
> schedule_work to start the work.
>
> [...]
Here is the summary with links:
- nfc: st-nci: Fix use after free bug in ndlc_remove due to race condition
https://git.kernel.org/netdev/net/c/5000fe6c2782
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html