* [PATCH 0/2] wifi: mt76: unlink TWT flows when MCU ADD fails
@ 2026-07-29 17:36 Zhao Li
2026-07-29 17:36 ` [PATCH 1/2] wifi: mt76: mt7915: unlink TWT flow on MCU add failure Zhao Li
2026-07-29 17:36 ` [PATCH 2/2] wifi: mt76: mt7996: " Zhao Li
0 siblings, 2 replies; 3+ messages in thread
From: Zhao Li @ 2026-07-29 17:36 UTC (permalink / raw)
To: Felix Fietkau, Lorenzo Bianconi, Ryder Lee
Cc: Shayne Chen, Sean Wang, Matthias Brugger,
AngeloGioacchino Del Regno, Rex Lu, Peter Chiu, Chad Monroe,
Howard Hsu, StanleyYP Wang, MeiChia Chiu, Bo Jiao, linux-wireless,
linux-kernel, linux-arm-kernel, linux-mediatek
mt7915 and mt7996 link a TWT flow into the device list before asking the
MCU to add the agreement. If that request fails, the accounting masks
remain clear but the embedded flow node stays linked.
A retry can corrupt the list by reinitializing the same linked node. If
the station is removed instead, the mask-gated teardown skips the flow,
leaving a dangling node for later scheduling and debugfs walks. The two
patches restore the list to its pre-request state on the MCU ADD failure
path, split per driver because their Fixes targets differ.
MCU DELETE failures are deliberately outside this series. Deciding
whether to drop host bookkeeping while firmware may retain an agreement
requires separate ownership and accounting treatment.
Zhao Li (2):
wifi: mt76: mt7915: unlink TWT flow on MCU add failure
wifi: mt76: mt7996: unlink TWT flow on MCU add failure
drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 4 +++-
drivers/net/wireless/mediatek/mt76/mt7996/mac.c | 4 +++-
2 files changed, 6 insertions(+), 2 deletions(-)
base-commit: 57aa1718d5953dd532137d43b696c68545c2e0b3
--
2.50.1 (Apple Git-155)
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] wifi: mt76: mt7915: unlink TWT flow on MCU add failure
2026-07-29 17:36 [PATCH 0/2] wifi: mt76: unlink TWT flows when MCU ADD fails Zhao Li
@ 2026-07-29 17:36 ` Zhao Li
2026-07-29 17:36 ` [PATCH 2/2] wifi: mt76: mt7996: " Zhao Li
1 sibling, 0 replies; 3+ messages in thread
From: Zhao Li @ 2026-07-29 17:36 UTC (permalink / raw)
To: Felix Fietkau, Lorenzo Bianconi, Ryder Lee
Cc: Shayne Chen, Sean Wang, Matthias Brugger,
AngeloGioacchino Del Regno, Rex Lu, Peter Chiu, Chad Monroe,
Howard Hsu, StanleyYP Wang, MeiChia Chiu, Bo Jiao, linux-wireless,
linux-kernel, linux-arm-kernel, linux-mediatek, stable
mt7915_mac_add_twt_setup() links a new flow into dev->twt_list before
asking the MCU to add the agreement, but exits without unlinking the flow
if the request fails. The flow-ID and table masks are only committed
after MCU success, so the still-linked flow is invisible to the
mask-gated teardown paths.
If the station retries the setup, the same slot is cleared and its
embedded list node reinitialized while it is still linked, corrupting
dev->twt_list and potentially preventing a scheduling walk from
terminating. If the station disassociates instead, teardown skips the
flow and station storage can be freed while the node remains linked. A
later scheduling or debugfs twt_stats walk can then dereference the
freed flow, resulting in a use-after-free.
Unlink the flow with list_del_init() on the MCU ADD failure path. This
restores the list to its pre-request state and leaves the node safe for a
retry. Mask and agreement accounting remain untouched because none of
it was committed before the failure.
Fixes: 3782b69d03e7 ("mt76: mt7915: introduce mt7915_mac_add_twt_setup routine")
Assisted-by: Codex:gpt-5.6-sol
Assisted-by: Kimi:K3
Cc: stable@vger.kernel.org
Signed-off-by: Zhao Li <enderaoelyther@gmail.com>
---
drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
index 334c19ab2b22..1ad54a5bb374 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mac.c
@@ -2345,8 +2345,10 @@ void mt7915_mac_add_twt_setup(struct ieee80211_hw *hw,
}
flow->tsf = le64_to_cpu(twt_agrt->twt);
- if (mt7915_mcu_twt_agrt_update(dev, msta->vif, flow, MCU_TWT_AGRT_ADD))
+ if (mt7915_mcu_twt_agrt_update(dev, msta->vif, flow, MCU_TWT_AGRT_ADD)) {
+ list_del_init(&flow->list);
goto unlock;
+ }
setup_cmd = TWT_SETUP_CMD_ACCEPT;
dev->twt.table_mask |= BIT(table_id);
--
2.50.1 (Apple Git-155)
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] wifi: mt76: mt7996: unlink TWT flow on MCU add failure
2026-07-29 17:36 [PATCH 0/2] wifi: mt76: unlink TWT flows when MCU ADD fails Zhao Li
2026-07-29 17:36 ` [PATCH 1/2] wifi: mt76: mt7915: unlink TWT flow on MCU add failure Zhao Li
@ 2026-07-29 17:36 ` Zhao Li
1 sibling, 0 replies; 3+ messages in thread
From: Zhao Li @ 2026-07-29 17:36 UTC (permalink / raw)
To: Felix Fietkau, Lorenzo Bianconi, Ryder Lee
Cc: Shayne Chen, Sean Wang, Matthias Brugger,
AngeloGioacchino Del Regno, Rex Lu, Peter Chiu, Chad Monroe,
Howard Hsu, StanleyYP Wang, MeiChia Chiu, Bo Jiao, linux-wireless,
linux-kernel, linux-arm-kernel, linux-mediatek, stable
mt7996_mac_add_twt_setup() links a new flow into dev->twt_list before
asking the MCU to add the agreement, but exits without unlinking the flow
if the request fails. The flow-ID and table masks are only committed
after MCU success, so the still-linked flow is invisible to the
mask-gated teardown paths.
If the station retries the setup, the same slot is cleared and its
embedded list node reinitialized while it is still linked, corrupting
dev->twt_list and potentially preventing a scheduling walk from
terminating. If the station disassociates instead, teardown skips the
flow and station storage can be freed while the node remains linked. A
later scheduling or debugfs twt_stats walk can then dereference the
freed flow, resulting in a use-after-free.
Unlink the flow with list_del_init() on the MCU ADD failure path. This
restores the list to its pre-request state and leaves the node safe for a
retry. Mask and agreement accounting remain untouched because none of
it was committed before the failure.
Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices")
Assisted-by: Codex:gpt-5.6-sol
Assisted-by: Kimi:K3
Cc: stable@vger.kernel.org
Signed-off-by: Zhao Li <enderaoelyther@gmail.com>
---
drivers/net/wireless/mediatek/mt76/mt7996/mac.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
index 0eebc8182ca9..445bd7d63cc8 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c
@@ -3207,8 +3207,10 @@ void mt7996_mac_add_twt_setup(struct ieee80211_hw *hw,
flow->tsf = le64_to_cpu(twt_agrt->twt);
if (mt7996_mcu_twt_agrt_update(dev, &msta->vif->deflink, flow,
- MCU_TWT_AGRT_ADD))
+ MCU_TWT_AGRT_ADD)) {
+ list_del_init(&flow->list);
goto unlock;
+ }
setup_cmd = TWT_SETUP_CMD_ACCEPT;
dev->twt.table_mask |= BIT(table_id);
--
2.50.1 (Apple Git-155)
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-07-29 17:37 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-29 17:36 [PATCH 0/2] wifi: mt76: unlink TWT flows when MCU ADD fails Zhao Li
2026-07-29 17:36 ` [PATCH 1/2] wifi: mt76: mt7915: unlink TWT flow on MCU add failure Zhao Li
2026-07-29 17:36 ` [PATCH 2/2] wifi: mt76: mt7996: " Zhao Li
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox