mt76: mt7921: fix the coredump is being truncated
authorSean Wang <sean.wang@mediatek.com>
Thu, 17 Jun 2021 01:39:19 +0000 (09:39 +0800)
committerFelix Fietkau <nbd@nbd.name>
Sat, 19 Jun 2021 07:22:51 +0000 (09:22 +0200)
Fix the maximum size of the coredump generated with current mt7921
firmware. Otherwise, a truncated coredump would be reported to userland
via dev_coredumpv.

Also, there is an additional error handling enhanced in the patch to avoid
the possible invalid buffer access when the system failed to create the
buffer to hold the coredump.

Fixes: 0da3c795d07b ("mt76: mt7921: add coredump support")
Co-developed-by: YN Chen <YN.Chen@mediatek.com>
Signed-off-by: YN Chen <YN.Chen@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76_connac.h
drivers/net/wireless/mediatek/mt76/mt7921/mac.c

index 93a37ed..f49d97d 100644 (file)
@@ -13,7 +13,7 @@
 #define MT76_CONNAC_MAX_SCAN_MATCH             16
 
 #define MT76_CONNAC_COREDUMP_TIMEOUT           (HZ / 20)
-#define MT76_CONNAC_COREDUMP_SZ                        (128 * 1024)
+#define MT76_CONNAC_COREDUMP_SZ                        (1300 * 1024)
 
 enum {
        CMD_CBW_20MHZ = IEEE80211_STA_RX_BW_20,
index 740773d..b8e64c5 100644 (file)
@@ -1548,7 +1548,7 @@ void mt7921_coredump_work(struct work_struct *work)
                        break;
 
                skb_pull(skb, sizeof(struct mt7921_mcu_rxd));
-               if (data + skb->len - dump > MT76_CONNAC_COREDUMP_SZ) {
+               if (!dump || data + skb->len - dump > MT76_CONNAC_COREDUMP_SZ) {
                        dev_kfree_skb(skb);
                        continue;
                }
@@ -1558,7 +1558,10 @@ void mt7921_coredump_work(struct work_struct *work)
 
                dev_kfree_skb(skb);
        }
-       dev_coredumpv(dev->mt76.dev, dump, MT76_CONNAC_COREDUMP_SZ,
-                     GFP_KERNEL);
+
+       if (dump)
+               dev_coredumpv(dev->mt76.dev, dump, MT76_CONNAC_COREDUMP_SZ,
+                             GFP_KERNEL);
+
        mt7921_reset(&dev->mt76);
 }