diff options
author | Ben Greear <greearb@candelatech.com> | 2022-09-29 18:15:25 +0300 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2022-10-01 15:38:05 +0300 |
commit | d75f15ddeb90e86ed286d7e0a5c06b3bfb15c33a (patch) | |
tree | 09c930f204b7d7159f5919e7191ea6b9fe499049 | |
parent | 9059a5de3bd01bcd176246e7fe1dff03540b0c46 (diff) |
wifi: mt76: mt7915: fix bounds checking for tx-free-done command
According to the tx-free-done documentation, the DW4 can be repeated,
so have to be more careful about how we test for walking off the
end of the array.
Signed-off-by: Ben Greear <greearb@candelatech.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
-rw-r--r-- | mt7915/mac.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/mt7915/mac.c b/mt7915/mac.c index b2322762..0c7a4d24 100644 --- a/mt7915/mac.c +++ b/mt7915/mac.c @@ -903,17 +903,19 @@ mt7915_mac_tx_free(struct mt7915_dev *dev, void *data, int len) total = le16_get_bits(free->ctrl, MT_TX_FREE_MSDU_CNT); v3 = (FIELD_GET(MT_TX_FREE_VER, txd) == 0x4); - if (WARN_ON_ONCE((void *)&tx_info[total >> v3] > end)) - return; for (cur_info = tx_info; count < total; cur_info++) { - u32 msdu, info = le32_to_cpu(*cur_info); + u32 msdu, info; u8 i; + if (WARN_ON_ONCE((void *)cur_info >= end)) + return; + /* * 1'b1: new wcid pair. * 1'b0: msdu_id with the same 'wcid pair' as above. */ + info = le32_to_cpu(*cur_info); if (info & MT_TX_FREE_PAIR) { struct mt7915_sta *msta; struct mt76_wcid *wcid; |