[PATCH 06/11] wifi: mt76: mt7925: validate register query response

From: Jiale Yao

Date: Mon Oct 19 2026 - 22:51:34 EST


The register query reads either a basic or RF register response without
checking its length. A truncated firmware response can cause an
out-of-bounds read.

Calculate the response size for the selected register type and reject
short responses before reading the value.

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 | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
index bca753d8ce71..ce860e63a108 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
@@ -113,7 +113,7 @@ int mt7925_mcu_regval(struct mt792x_dev *dev, u32 regidx, u32 *val, bool set)
};
} __packed * res, req;
struct sk_buff *skb;
- int ret;
+ int len, ret;

if (u32_get_bits(regidx, MT_RF_REG_HDR) == RF_REG_PREFIX) {
req.rf_reg.tag = cpu_to_le16(UNI_CMD_ACCESS_RF_REG_BASIC);
@@ -138,6 +138,17 @@ int mt7925_mcu_regval(struct mt792x_dev *dev, u32 regidx, u32 *val, bool set)
if (ret)
return ret;

+ len = sizeof(res->__rsv);
+ if (u32_get_bits(regidx, MT_RF_REG_HDR) == RF_REG_PREFIX)
+ len += sizeof(res->rf_reg);
+ else
+ len += sizeof(res->reg);
+
+ if (skb->len < len) {
+ dev_kfree_skb(skb);
+ return -EINVAL;
+ }
+
res = (void *)skb->data;
if (u32_get_bits(regidx, MT_RF_REG_HDR) == RF_REG_PREFIX)
*val = le32_to_cpu(res->rf_reg.data);
--
2.34.1