linux/drivers/atm
Duoming Zhou 73fbc5d1a9 atm: fore200e: fix use-after-free in tasklets during device removal
[ Upstream commit 8930878101 ]

When the PCA-200E or SBA-200E adapter is being detached, the fore200e
is deallocated. However, the tx_tasklet or rx_tasklet may still be running
or pending, leading to use-after-free bug when the already freed fore200e
is accessed again in fore200e_tx_tasklet() or fore200e_rx_tasklet().

One of the race conditions can occur as follows:

CPU 0 (cleanup)           | CPU 1 (tasklet)
fore200e_pca_remove_one() | fore200e_interrupt()
  fore200e_shutdown()     |   tasklet_schedule()
    kfree(fore200e)       | fore200e_tx_tasklet()
                          |   fore200e-> // UAF

Fix this by ensuring tx_tasklet or rx_tasklet is properly canceled before
the fore200e is released. Add tasklet_kill() in fore200e_shutdown() to
synchronize with any pending or running tasklets. Moreover, since
fore200e_reset() could prevent further interrupts or data transfers,
the tasklet_kill() should be placed after fore200e_reset() to prevent
the tasklet from being rescheduled in fore200e_interrupt(). Finally,
it only needs to do tasklet_kill() when the fore200e state is greater
than or equal to FORE200E_STATE_IRQ, since tasklets are uninitialized
in earlier states. In a word, the tasklet_kill() should be placed in
the FORE200E_STATE_IRQ branch within the switch...case structure.

This bug was identified through static analysis.

Fixes: 1da177e4c3 ("Linux-2.6.12-rc2")
Cc: stable@kernel.org
Suggested-by: Jijie Shao <shaojijie@huawei.com>
Signed-off-by: Duoming Zhou <duoming@zju.edu.cn>
Reviewed-by: Jijie Shao <shaojijie@huawei.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260210094537.9767-1-duoming@zju.edu.cn
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2026-03-04 07:20:36 -05:00
..
.gitignore .gitignore: add SPDX License Identifier 2020-03-25 11:50:48 +01:00
adummy.c treewide: Add SPDX license identifier for more missed files 2019-05-21 10:50:45 +02:00
ambassador.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 37 2019-05-24 17:27:11 +02:00
ambassador.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 37 2019-05-24 17:27:11 +02:00
atmtcp.c atm: atmtcp: Prevent arbitrary write in atmtcp_recv_control(). 2025-09-04 14:28:45 +02:00
eni.c atm: eni: Add check for dma_map_single 2022-03-23 09:16:41 +01:00
eni.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
firestream.c atm: firestream: check the return value of ioremap() in fs_init() 2022-03-19 13:47:49 +01:00
firestream.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 37 2019-05-24 17:27:11 +02:00
fore200e.c atm: fore200e: fix use-after-free in tasklets during device removal 2026-03-04 07:20:36 -05:00
fore200e.h fore200e: devirtualize dma alloc calls 2018-10-10 22:38:50 -07:00
he.c atm: Fix dma_free_coherent() size 2026-01-19 13:10:13 +01:00
he.h atm: remove deprecated use of pci api 2015-01-18 00:28:41 -05:00
horizon.c atm: horizon: Fix spelling mistakes in TX comment 2021-08-08 12:58:42 +01:00
horizon.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 37 2019-05-24 17:27:11 +02:00
idt77105.c atm: idt77252: fix null-ptr-dereference 2021-03-08 15:16:30 -08:00
idt77105.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
idt77252.c atm: idt77252: Add missing dma_map_error() 2025-07-17 18:30:54 +02:00
idt77252.h atm: idt77252: fix build broken on amd64 2021-02-15 12:36:27 -08:00
idt77252_tables.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
iphase.c atm: iphase: Do PCI error checks on own line 2023-11-28 16:56:18 +00:00
iphase.h atm: Replace custom isprint() with generic analogue 2021-05-10 14:51:01 -07:00
Kconfig docs: networking: move ATM drivers to the hw driver section 2020-06-26 16:08:45 -07:00
lanai.c atm: lanai: dont run lanai_dev_close if not open 2021-03-01 13:18:54 -08:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
midway.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
nicstar.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2021-06-29 15:45:27 -07:00
nicstar.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
nicstarmac.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
nicstarmac.copyright drivers/atm/: remove CVS keywords 2008-05-20 14:52:25 -07:00
solos-attrlist.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
solos-pci.c atm: solos-pci: Fix potential deadlock on &tx_queue_lock 2023-12-20 15:17:35 +01:00
suni.c atm: delete include/linux/atm_suni.h 2021-03-15 12:43:10 -07:00
suni.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
tonga.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
uPD98401.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
uPD98402.c atm: uPD98402: fix incorrect allocation 2021-03-08 15:16:30 -08:00
uPD98402.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
zatm.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
zatm.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
zeprom.h atm: Fix typo 2021-05-21 13:55:32 -07:00