[PATCH 05/11] wifi: mt76: mt7925: validate MCU response lengths
From: Jiale Yao
Date: Mon Oct 19 2026 - 22:50:26 EST
The MCU parser reads receive descriptor and UNI event fields without
checking whether they are present. Truncated firmware responses can
therefore cause out-of-bounds reads.
Account for the shorter patch responses and validate all other receive
descriptors and UNI event payloads before accessing them.
Fixes: c948b5da6bbe ("wifi: mt76: mt7925: add Mediatek Wi-Fi7 driver for mt7925 chips")
Signed-off-by: Jiale Yao <yaojiale02@xxxxxxx>
---
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
index fa29c486a455..bca753d8ce71 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
@@ -32,6 +32,17 @@ int mt7925_mcu_parse_response(struct mt76_dev *mdev, int cmd,
return -ETIMEDOUT;
}
+ if ((cmd == MCU_CMD(PATCH_SEM_CONTROL) ||
+ cmd == MCU_CMD(PATCH_FINISH_REQ) ||
+ cmd == MCU_CMD(CB_PATCH_SEM_CONTROL) ||
+ cmd == MCU_CMD(CB_PATCH_FINISH_REQ)) &&
+ skb->len < sizeof(*rxd) - 4 + sizeof(u8))
+ return -EINVAL;
+ if (cmd != MCU_CMD(PATCH_SEM_CONTROL) &&
+ cmd != MCU_CMD(PATCH_FINISH_REQ) &&
+ cmd != MCU_CMD(CB_PATCH_SEM_CONTROL) &&
+ cmd != MCU_CMD(CB_PATCH_FINISH_REQ) && skb->len < sizeof(*rxd))
+ return -EINVAL;
rxd = (struct mt7925_mcu_rxd *)skb->data;
if (seq != rxd->seq) {
@@ -60,6 +71,9 @@ int mt7925_mcu_parse_response(struct mt76_dev *mdev, int cmd,
cmd == MCU_UNI_CMD(NAN)) {
struct mt7925_mcu_uni_event *event;
+ if (skb->len < sizeof(*rxd) + sizeof(*event))
+ return -EINVAL;
+
skb_pull(skb, sizeof(*rxd));
event = (struct mt7925_mcu_uni_event *)skb->data;
ret = le32_to_cpu(event->status);
--
2.34.1