staging: rtl8188: avoid excessive stack usage
authorArnd Bergmann <arnd@arndb.de>
Sat, 4 Jan 2020 21:48:21 +0000 (22:48 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Jan 2020 09:58:31 +0000 (10:58 +0100)
The rtl8188 copy of the os_dep support code causes a
warning about a very significant stack usage in the translate_scan()
function:

drivers/staging/rtl8188eu/os_dep/ioctl_linux.c: In function 'translate_scan':
drivers/staging/rtl8188eu/os_dep/ioctl_linux.c:306:1: error: the frame size of 1560 bytes is larger than 1400 bytes [-Werror=frame-larger-than=]

Use the same trick as in the rtl8723bs copy of the same function, and
allocate it dynamically.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Link: https://lore.kernel.org/r/20200104214832.558198-1-arnd@arndb.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rtl8188eu/os_dep/ioctl_linux.c

index 710c33f..47f4cc6 100644 (file)
@@ -222,18 +222,21 @@ static char *translate_scan(struct adapter *padapter,
 
        /* parsing WPA/WPA2 IE */
        {
-               u8 buf[MAX_WPA_IE_LEN];
+               u8 *buf;
                u8 wpa_ie[255], rsn_ie[255];
                u16 wpa_len = 0, rsn_len = 0;
                u8 *p;
 
+               buf = kzalloc(MAX_WPA_IE_LEN, GFP_ATOMIC);
+               if (!buf)
+                       return start;
+
                rtw_get_sec_ie(pnetwork->network.ies, pnetwork->network.ie_length, rsn_ie, &rsn_len, wpa_ie, &wpa_len);
                RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("rtw_wx_get_scan: ssid =%s\n", pnetwork->network.ssid.ssid));
                RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("rtw_wx_get_scan: wpa_len =%d rsn_len =%d\n", wpa_len, rsn_len));
 
                if (wpa_len > 0) {
                        p = buf;
-                       memset(buf, 0, MAX_WPA_IE_LEN);
                        p += sprintf(p, "wpa_ie=");
                        for (i = 0; i < wpa_len; i++)
                                p += sprintf(p, "%02x", wpa_ie[i]);
@@ -250,7 +253,6 @@ static char *translate_scan(struct adapter *padapter,
                }
                if (rsn_len > 0) {
                        p = buf;
-                       memset(buf, 0, MAX_WPA_IE_LEN);
                        p += sprintf(p, "rsn_ie=");
                        for (i = 0; i < rsn_len; i++)
                                p += sprintf(p, "%02x", rsn_ie[i]);
@@ -264,6 +266,7 @@ static char *translate_scan(struct adapter *padapter,
                        iwe.u.data.length = rsn_len;
                        start = iwe_stream_add_point(info, start, stop, &iwe, rsn_ie);
                }
+               kfree(buf);
        }
 
        {/* parsing WPS IE */