staging: wlan-ng: cfg80211: Move large struct onto the heap
authorLee Jones <lee.jones@linaro.org>
Wed, 14 Apr 2021 18:10:39 +0000 (19:10 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 10 May 2021 09:19:23 +0000 (11:19 +0200)
Fixes the following W=1 kernel build warning(s):

 drivers/staging/wlan-ng/cfg80211.c: In function ‘prism2_scan’:
 drivers/staging/wlan-ng/cfg80211.c:388:1: warning: the frame size of 1296 bytes is larger than 1024 bytes [-Wframe-larger-than=]

Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Sumera Priyadarsini <sylphrenadin@gmail.com>
Cc: linux-staging@lists.linux.dev
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Link: https://lore.kernel.org/r/20210414181129.1628598-8-lee.jones@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/wlan-ng/cfg80211.c

index 759e475e303c06c440cb85fb6e640441eb20f19f..7951bd63816ff929aa6eba2ae39d3e5c81dbccf8 100644 (file)
@@ -276,7 +276,7 @@ static int prism2_scan(struct wiphy *wiphy,
        struct prism2_wiphy_private *priv = wiphy_priv(wiphy);
        struct wlandevice *wlandev;
        struct p80211msg_dot11req_scan msg1;
-       struct p80211msg_dot11req_scan_results msg2;
+       struct p80211msg_dot11req_scan_results *msg2;
        struct cfg80211_bss *bss;
        struct cfg80211_scan_info info = {};
 
@@ -301,6 +301,10 @@ static int prism2_scan(struct wiphy *wiphy,
                return -EOPNOTSUPP;
        }
 
+       msg2 = kzalloc(sizeof(*msg2), GFP_KERNEL);
+       if (!msg2)
+               return -ENOMEM;
+
        priv->scan_request = request;
 
        memset(&msg1, 0x00, sizeof(msg1));
@@ -342,31 +346,30 @@ static int prism2_scan(struct wiphy *wiphy,
        for (i = 0; i < numbss; i++) {
                int freq;
 
-               memset(&msg2, 0, sizeof(msg2));
-               msg2.msgcode = DIDMSG_DOT11REQ_SCAN_RESULTS;
-               msg2.bssindex.data = i;
+               msg2->msgcode = DIDMSG_DOT11REQ_SCAN_RESULTS;
+               msg2->bssindex.data = i;
 
                result = p80211req_dorequest(wlandev, (u8 *)&msg2);
                if ((result != 0) ||
-                   (msg2.resultcode.data != P80211ENUM_resultcode_success)) {
+                   (msg2->resultcode.data != P80211ENUM_resultcode_success)) {
                        break;
                }
 
                ie_buf[0] = WLAN_EID_SSID;
-               ie_buf[1] = msg2.ssid.data.len;
+               ie_buf[1] = msg2->ssid.data.len;
                ie_len = ie_buf[1] + 2;
-               memcpy(&ie_buf[2], &msg2.ssid.data.data, msg2.ssid.data.len);
-               freq = ieee80211_channel_to_frequency(msg2.dschannel.data,
+               memcpy(&ie_buf[2], &msg2->ssid.data.data, msg2->ssid.data.len);
+               freq = ieee80211_channel_to_frequency(msg2->dschannel.data,
                                                      NL80211_BAND_2GHZ);
                bss = cfg80211_inform_bss(wiphy,
                                          ieee80211_get_channel(wiphy, freq),
                                          CFG80211_BSS_FTYPE_UNKNOWN,
-                                         (const u8 *)&msg2.bssid.data.data,
-                                         msg2.timestamp.data, msg2.capinfo.data,
-                                         msg2.beaconperiod.data,
+                                         (const u8 *)&msg2->bssid.data.data,
+                                         msg2->timestamp.data, msg2->capinfo.data,
+                                         msg2->beaconperiod.data,
                                          ie_buf,
                                          ie_len,
-                                         (msg2.signal.data - 65536) * 100, /* Conversion to signed type */
+                                         (msg2->signal.data - 65536) * 100, /* Conversion to signed type */
                                          GFP_KERNEL);
 
                if (!bss) {
@@ -378,12 +381,13 @@ static int prism2_scan(struct wiphy *wiphy,
        }
 
        if (result)
-               err = prism2_result2err(msg2.resultcode.data);
+               err = prism2_result2err(msg2->resultcode.data);
 
 exit:
        info.aborted = !!(err);
        cfg80211_scan_done(request, &info);
        priv->scan_request = NULL;
+       kfree(msg2);
        return err;
 }