Skip to content

Commit 652e836

Browse files
committed
mac80211: handle various extensible elements correctly
Various elements are parsed with a requirement to have an exact size, when really we should only check that they have the minimum size that we need. Check only that and therefore ignore any additional data that they might carry. Signed-off-by: Johannes Berg <[email protected]> Signed-off-by: Luca Coelho <[email protected]> Link: https://lore.kernel.org/r/iwlwifi.20210618133832.cd101f8040a4.Iadf0e9b37b100c6c6e79c7b298cc657c2be9151a@changeid Signed-off-by: Johannes Berg <[email protected]>
1 parent bbc6f03 commit 652e836

File tree

1 file changed

+11
-11
lines changed

1 file changed

+11
-11
lines changed

net/mac80211/util.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,7 @@ static void ieee80211_parse_extension_element(u32 *crc,
947947

948948
switch (elem->data[0]) {
949949
case WLAN_EID_EXT_HE_MU_EDCA:
950-
if (len == sizeof(*elems->mu_edca_param_set)) {
950+
if (len >= sizeof(*elems->mu_edca_param_set)) {
951951
elems->mu_edca_param_set = data;
952952
if (crc)
953953
*crc = crc32_be(*crc, (void *)elem,
@@ -968,15 +968,15 @@ static void ieee80211_parse_extension_element(u32 *crc,
968968
}
969969
break;
970970
case WLAN_EID_EXT_UORA:
971-
if (len == 1)
971+
if (len >= 1)
972972
elems->uora_element = data;
973973
break;
974974
case WLAN_EID_EXT_MAX_CHANNEL_SWITCH_TIME:
975975
if (len == 3)
976976
elems->max_channel_switch_time = data;
977977
break;
978978
case WLAN_EID_EXT_MULTIPLE_BSSID_CONFIGURATION:
979-
if (len == sizeof(*elems->mbssid_config_ie))
979+
if (len >= sizeof(*elems->mbssid_config_ie))
980980
elems->mbssid_config_ie = data;
981981
break;
982982
case WLAN_EID_EXT_HE_SPR:
@@ -985,7 +985,7 @@ static void ieee80211_parse_extension_element(u32 *crc,
985985
elems->he_spr = data;
986986
break;
987987
case WLAN_EID_EXT_HE_6GHZ_CAPA:
988-
if (len == sizeof(*elems->he_6ghz_capa))
988+
if (len >= sizeof(*elems->he_6ghz_capa))
989989
elems->he_6ghz_capa = data;
990990
break;
991991
}
@@ -1074,14 +1074,14 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
10741074

10751075
switch (id) {
10761076
case WLAN_EID_LINK_ID:
1077-
if (elen + 2 != sizeof(struct ieee80211_tdls_lnkie)) {
1077+
if (elen + 2 < sizeof(struct ieee80211_tdls_lnkie)) {
10781078
elem_parse_failed = true;
10791079
break;
10801080
}
10811081
elems->lnk_id = (void *)(pos - 2);
10821082
break;
10831083
case WLAN_EID_CHAN_SWITCH_TIMING:
1084-
if (elen != sizeof(struct ieee80211_ch_switch_timing)) {
1084+
if (elen < sizeof(struct ieee80211_ch_switch_timing)) {
10851085
elem_parse_failed = true;
10861086
break;
10871087
}
@@ -1244,7 +1244,7 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
12441244
elems->sec_chan_offs = (void *)pos;
12451245
break;
12461246
case WLAN_EID_CHAN_SWITCH_PARAM:
1247-
if (elen !=
1247+
if (elen <
12481248
sizeof(*elems->mesh_chansw_params_ie)) {
12491249
elem_parse_failed = true;
12501250
break;
@@ -1253,7 +1253,7 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
12531253
break;
12541254
case WLAN_EID_WIDE_BW_CHANNEL_SWITCH:
12551255
if (!action ||
1256-
elen != sizeof(*elems->wide_bw_chansw_ie)) {
1256+
elen < sizeof(*elems->wide_bw_chansw_ie)) {
12571257
elem_parse_failed = true;
12581258
break;
12591259
}
@@ -1272,7 +1272,7 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
12721272
ie = cfg80211_find_ie(WLAN_EID_WIDE_BW_CHANNEL_SWITCH,
12731273
pos, elen);
12741274
if (ie) {
1275-
if (ie[1] == sizeof(*elems->wide_bw_chansw_ie))
1275+
if (ie[1] >= sizeof(*elems->wide_bw_chansw_ie))
12761276
elems->wide_bw_chansw_ie =
12771277
(void *)(ie + 2);
12781278
else
@@ -1316,7 +1316,7 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
13161316
elems->cisco_dtpc_elem = pos;
13171317
break;
13181318
case WLAN_EID_ADDBA_EXT:
1319-
if (elen != sizeof(struct ieee80211_addba_ext_ie)) {
1319+
if (elen < sizeof(struct ieee80211_addba_ext_ie)) {
13201320
elem_parse_failed = true;
13211321
break;
13221322
}
@@ -1342,7 +1342,7 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
13421342
elem, elems);
13431343
break;
13441344
case WLAN_EID_S1G_CAPABILITIES:
1345-
if (elen == sizeof(*elems->s1g_capab))
1345+
if (elen >= sizeof(*elems->s1g_capab))
13461346
elems->s1g_capab = (void *)pos;
13471347
else
13481348
elem_parse_failed = true;

0 commit comments

Comments
 (0)