mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-17 10:26:09 +00:00
nfc: st-nci: Fix use after free bug in ndlc_remove due to race condition
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 <zyytlz.wz@163.com> Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Link: https://lore.kernel.org/r/20230312160837.2040857-1-zyytlz.wz@163.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
cf18d55e53
commit
5000fe6c27
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user