wifi: mt76: fix potential memory leak of beacon commands
authorBo Jiao <Bo.Jiao@mediatek.com>
Thu, 31 Aug 2023 06:22:16 +0000 (14:22 +0800)
committerFelix Fietkau <nbd@nbd.name>
Sat, 30 Sep 2023 18:03:05 +0000 (20:03 +0200)
Fix potential memory leak when setting beacon and inband discovery
commands.

Fixes: e57b7901469f ("mt76: add mac80211 driver for MT7915 PCIe-based chipsets")
Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices")
Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
drivers/net/wireless/mediatek/mt76/mt7996/mcu.c

index 8350f84c7644fdc79296eb8eab5a5a1c52723e3e..f18dc777edcbb95d9f85cd4a63559250f3a37745 100644 (file)
@@ -1927,8 +1927,10 @@ mt7915_mcu_add_inband_discov(struct mt7915_dev *dev, struct ieee80211_vif *vif,
                skb = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif);
        }
 
-       if (!skb)
+       if (!skb) {
+               dev_kfree_skb(rskb);
                return -EINVAL;
+       }
 
        info = IEEE80211_SKB_CB(skb);
        info->control.vif = vif;
@@ -1940,6 +1942,7 @@ mt7915_mcu_add_inband_discov(struct mt7915_dev *dev, struct ieee80211_vif *vif,
 
        if (skb->len > MT7915_MAX_BEACON_SIZE) {
                dev_err(dev->mt76.dev, "inband discovery size limit exceed\n");
+               dev_kfree_skb(rskb);
                dev_kfree_skb(skb);
                return -EINVAL;
        }
@@ -1996,11 +1999,14 @@ int mt7915_mcu_add_beacon(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                goto out;
 
        skb = ieee80211_beacon_get_template(hw, vif, &offs, 0);
-       if (!skb)
+       if (!skb) {
+               dev_kfree_skb(rskb);
                return -EINVAL;
+       }
 
        if (skb->len > MT7915_MAX_BEACON_SIZE) {
                dev_err(dev->mt76.dev, "Bcn size limit exceed\n");
+               dev_kfree_skb(rskb);
                dev_kfree_skb(skb);
                return -EINVAL;
        }
index b26396b2f87b9ea5ce4660eb0ebeabf94906e6ba..4de0c4a97fc4b500e9885bed53f0a971dddb53c3 100644 (file)
@@ -2252,11 +2252,14 @@ int mt7996_mcu_add_beacon(struct ieee80211_hw *hw,
                return PTR_ERR(rskb);
 
        skb = ieee80211_beacon_get_template(hw, vif, &offs, 0);
-       if (!skb)
+       if (!skb) {
+               dev_kfree_skb(rskb);
                return -EINVAL;
+       }
 
        if (skb->len > MT7996_MAX_BEACON_SIZE) {
                dev_err(dev->mt76.dev, "Bcn size limit exceed\n");
+               dev_kfree_skb(rskb);
                dev_kfree_skb(skb);
                return -EINVAL;
        }
@@ -2316,11 +2319,14 @@ int mt7996_mcu_beacon_inband_discov(struct mt7996_dev *dev,
                skb = ieee80211_get_unsol_bcast_probe_resp_tmpl(hw, vif);
        }
 
-       if (!skb)
+       if (!skb) {
+               dev_kfree_skb(rskb);
                return -EINVAL;
+       }
 
        if (skb->len > MT7996_MAX_BEACON_SIZE) {
                dev_err(dev->mt76.dev, "inband discovery size limit exceed\n");
+               dev_kfree_skb(rskb);
                dev_kfree_skb(skb);
                return -EINVAL;
        }