Revert "staging: r8188eu: use in-kernel ieee channel"
authorSolomon Tan <wjsota@gmail.com>
Mon, 25 Apr 2022 05:28:03 +0000 (13:28 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 26 Apr 2022 09:28:35 +0000 (11:28 +0200)
This reverts commit 0afaa121813ed602bd203759c339cb639493f8c2 as changing
rtw_ieee80211_channel to ieee80211_channel causes a memcpy bug as
reported in:
https://lore.kernel.org/linux-staging/67e2d10b-7f0f-9c5a-ce31-376b83ffba9e@gmail.com/
due to their size differences.

Fixes: 0afaa121813e ("staging: r8188eu: use in-kernel ieee channel")
Reported-by: Michael Straube <straube.linux@gmail.com>
Signed-off-by: Solomon Tan <wjsota@gmail.com>
Link: https://lore.kernel.org/r/20220425052802.2419-1-wjsota@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/r8188eu/core/rtw_cmd.c
drivers/staging/r8188eu/core/rtw_mlme_ext.c
drivers/staging/r8188eu/include/ieee80211.h
drivers/staging/r8188eu/include/rtw_cmd.h
drivers/staging/r8188eu/include/rtw_mlme_ext.h

index ebe2479..f036a98 100644 (file)
@@ -320,7 +320,7 @@ post_process:
  *     MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock
  */
 u8 rtw_sitesurvey_cmd(struct adapter  *padapter, struct ndis_802_11_ssid *ssid, int ssid_num,
-       struct ieee80211_channel *ch, int ch_num)
+       struct rtw_ieee80211_channel *ch, int ch_num)
 {
        u8 res = _FAIL;
        struct cmd_obj          *ph2c;
@@ -366,8 +366,8 @@ u8 rtw_sitesurvey_cmd(struct adapter  *padapter, struct ndis_802_11_ssid *ssid,
        if (ch) {
                int i;
                for (i = 0; i < ch_num && i < RTW_CHANNEL_SCAN_AMOUNT; i++) {
-                       if (ch[i].hw_value && !(ch[i].flags & IEEE80211_CHAN_DISABLED)) {
-                               memcpy(&psurveyPara->ch[i], &ch[i], sizeof(struct ieee80211_channel));
+                       if (ch[i].hw_value && !(ch[i].flags & RTW_IEEE80211_CHAN_DISABLED)) {
+                               memcpy(&psurveyPara->ch[i], &ch[i], sizeof(struct rtw_ieee80211_channel));
                                psurveyPara->ch_num++;
                        }
                }
index 7739a0b..839b0b8 100644 (file)
@@ -5749,11 +5749,11 @@ void site_survey(struct adapter *padapter)
                else
                        ScanType = SCAN_ACTIVE;
        } else {
-               struct ieee80211_channel *ch;
+               struct rtw_ieee80211_channel *ch;
                if (pmlmeext->sitesurvey_res.channel_idx < pmlmeext->sitesurvey_res.ch_num) {
                        ch = &pmlmeext->sitesurvey_res.ch[pmlmeext->sitesurvey_res.channel_idx];
                        survey_channel = ch->hw_value;
-                       ScanType = (ch->flags & IEEE80211_CHAN_NO_IR) ? SCAN_PASSIVE : SCAN_ACTIVE;
+                       ScanType = (ch->flags & RTW_IEEE80211_CHAN_PASSIVE_SCAN) ? SCAN_PASSIVE : SCAN_ACTIVE;
                }
        }
 
@@ -7280,26 +7280,26 @@ u8 disconnect_hdl(struct adapter *padapter, unsigned char *pbuf)
        return  H2C_SUCCESS;
 }
 
-static int rtw_scan_ch_decision(struct adapter *padapter, struct ieee80211_channel *out,
-       u32 out_num, struct ieee80211_channel *in, u32 in_num)
+static int rtw_scan_ch_decision(struct adapter *padapter, struct rtw_ieee80211_channel *out,
+       u32 out_num, struct rtw_ieee80211_channel *in, u32 in_num)
 {
        int i, j;
        int set_idx;
        struct mlme_ext_priv    *pmlmeext = &padapter->mlmeextpriv;
 
        /* clear out first */
-       memset(out, 0, sizeof(struct ieee80211_channel) * out_num);
+       memset(out, 0, sizeof(struct rtw_ieee80211_channel) * out_num);
 
        /* acquire channels from in */
        j = 0;
        for (i = 0; i < in_num; i++) {
                set_idx = rtw_ch_set_search_ch(pmlmeext->channel_set, in[i].hw_value);
-               if (in[i].hw_value && !(in[i].flags & IEEE80211_CHAN_DISABLED) &&
+               if (in[i].hw_value && !(in[i].flags & RTW_IEEE80211_CHAN_DISABLED) &&
                    set_idx >= 0) {
-                       memcpy(&out[j], &in[i], sizeof(struct ieee80211_channel));
+                       memcpy(&out[j], &in[i], sizeof(struct rtw_ieee80211_channel));
 
                        if (pmlmeext->channel_set[set_idx].ScanType == SCAN_PASSIVE)
-                               out[j].flags &= IEEE80211_CHAN_NO_IR;
+                               out[j].flags &= RTW_IEEE80211_CHAN_PASSIVE_SCAN;
 
                        j++;
                }
@@ -7313,7 +7313,7 @@ static int rtw_scan_ch_decision(struct adapter *padapter, struct ieee80211_chann
                        out[i].hw_value = pmlmeext->channel_set[i].ChannelNum;
 
                        if (pmlmeext->channel_set[i].ScanType == SCAN_PASSIVE)
-                               out[i].flags &= IEEE80211_CHAN_NO_IR;
+                               out[i].flags &= RTW_IEEE80211_CHAN_PASSIVE_SCAN;
 
                        j++;
                }
index 788c987..fe2dc2a 100644 (file)
@@ -8,7 +8,6 @@
 #include "drv_types.h"
 #include "wifi.h"
 #include <linux/wireless.h>
-#include <net/cfg80211.h>
 
 #define MGMT_QUEUE_NUM 5
 
@@ -666,6 +665,39 @@ enum rtw_ieee80211_back_actioncode {
 
 #define VENDOR_HT_CAPAB_OUI_TYPE 0x33 /* 00-90-4c:0x33 */
 
+/**
+ * enum rtw_ieee80211_channel_flags - channel flags
+ *
+ * Channel flags set by the regulatory control code.
+ *
+ * @RTW_IEEE80211_CHAN_DISABLED: This channel is disabled.
+ * @RTW_IEEE80211_CHAN_PASSIVE_SCAN: Only passive scanning is permitted
+ *      on this channel.
+ * @RTW_IEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel.
+ * @RTW_IEEE80211_CHAN_RADAR: Radar detection is required on this channel.
+ * @RTW_IEEE80211_CHAN_NO_HT40PLUS: extension channel above this channel
+ *      is not permitted.
+ * @RTW_IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channel
+ *      is not permitted.
+ */
+enum rtw_ieee80211_channel_flags {
+       RTW_IEEE80211_CHAN_DISABLED      = 1<<0,
+       RTW_IEEE80211_CHAN_PASSIVE_SCAN     = 1<<1,
+       RTW_IEEE80211_CHAN_NO_IBSS        = 1<<2,
+       RTW_IEEE80211_CHAN_RADAR            = 1<<3,
+       RTW_IEEE80211_CHAN_NO_HT40PLUS      = 1<<4,
+       RTW_IEEE80211_CHAN_NO_HT40MINUS     = 1<<5,
+};
+
+#define RTW_IEEE80211_CHAN_NO_HT40 \
+         (RTW_IEEE80211_CHAN_NO_HT40PLUS | RTW_IEEE80211_CHAN_NO_HT40MINUS)
+
+/* Represent channel details, subset of ieee80211_channel */
+struct rtw_ieee80211_channel {
+       u16 hw_value;
+       u32 flags;
+};
+
 #define CHAN_FMT \
        "hw_value:%u, " \
        "flags:0x%08x" \
index ee15f93..6b6d560 100644 (file)
@@ -187,7 +187,7 @@ struct sitesurvey_parm {
        u8 ssid_num;
        u8 ch_num;
        struct ndis_802_11_ssid ssid[RTW_SSID_SCAN_AMOUNT];
-       struct ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
+       struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
 };
 
 /*
@@ -731,7 +731,7 @@ Result:
 #define H2C_RESERVED           0x07
 
 u8 rtw_sitesurvey_cmd(struct adapter  *padapter, struct ndis_802_11_ssid *ssid,
-                     int ssid_num, struct ieee80211_channel *ch,
+                     int ssid_num, struct rtw_ieee80211_channel *ch,
                      int ch_num);
 u8 rtw_createbss_cmd(struct adapter  *padapter);
 u8 rtw_setstakey_cmd(struct adapter *padapter, u8 *psta, u8 unicast_key);
index fed8e77..dcf91e7 100644 (file)
@@ -200,7 +200,7 @@ struct      ss_res {
        u8 ssid_num;
        u8 ch_num;
        struct ndis_802_11_ssid ssid[RTW_SSID_SCAN_AMOUNT];
-       struct ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
+       struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
 };
 
 /* define AP_MODE                              0x0C */