summaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2019-05-29 08:52:20 -0400
committerKalle Valo <kvalo@codeaurora.org>2019-05-30 07:22:12 -0400
commit685c9b7750bfacd6fc1db50d86579980593b7869 (patch)
treeb662ff8b773c688458ac810d1ee67b7e0fcaf829 /drivers/net/wireless
parent13ec7f10b87f5fc04c4ccbd491c94c7980236a74 (diff)
mwifiex: Abort at too short BSS descriptor element
Currently mwifiex_update_bss_desc_with_ie() implicitly assumes that the source descriptor entries contain the enough size for each type and performs copying without checking the source size. This may lead to read over boundary. Fix this by putting the source size check in appropriate places. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/marvell/mwifiex/scan.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/net/wireless/marvell/mwifiex/scan.c b/drivers/net/wireless/marvell/mwifiex/scan.c
index 64ab6fe78c0d..c269a0de9413 100644
--- a/drivers/net/wireless/marvell/mwifiex/scan.c
+++ b/drivers/net/wireless/marvell/mwifiex/scan.c
@@ -1269,6 +1269,8 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter,
1269 break; 1269 break;
1270 1270
1271 case WLAN_EID_FH_PARAMS: 1271 case WLAN_EID_FH_PARAMS:
1272 if (element_len + 2 < sizeof(*fh_param_set))
1273 return -EINVAL;
1272 fh_param_set = 1274 fh_param_set =
1273 (struct ieee_types_fh_param_set *) current_ptr; 1275 (struct ieee_types_fh_param_set *) current_ptr;
1274 memcpy(&bss_entry->phy_param_set.fh_param_set, 1276 memcpy(&bss_entry->phy_param_set.fh_param_set,
@@ -1277,6 +1279,8 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter,
1277 break; 1279 break;
1278 1280
1279 case WLAN_EID_DS_PARAMS: 1281 case WLAN_EID_DS_PARAMS:
1282 if (element_len + 2 < sizeof(*ds_param_set))
1283 return -EINVAL;
1280 ds_param_set = 1284 ds_param_set =
1281 (struct ieee_types_ds_param_set *) current_ptr; 1285 (struct ieee_types_ds_param_set *) current_ptr;
1282 1286
@@ -1288,6 +1292,8 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter,
1288 break; 1292 break;
1289 1293
1290 case WLAN_EID_CF_PARAMS: 1294 case WLAN_EID_CF_PARAMS:
1295 if (element_len + 2 < sizeof(*cf_param_set))
1296 return -EINVAL;
1291 cf_param_set = 1297 cf_param_set =
1292 (struct ieee_types_cf_param_set *) current_ptr; 1298 (struct ieee_types_cf_param_set *) current_ptr;
1293 memcpy(&bss_entry->ss_param_set.cf_param_set, 1299 memcpy(&bss_entry->ss_param_set.cf_param_set,
@@ -1296,6 +1302,8 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter,
1296 break; 1302 break;
1297 1303
1298 case WLAN_EID_IBSS_PARAMS: 1304 case WLAN_EID_IBSS_PARAMS:
1305 if (element_len + 2 < sizeof(*ibss_param_set))
1306 return -EINVAL;
1299 ibss_param_set = 1307 ibss_param_set =
1300 (struct ieee_types_ibss_param_set *) 1308 (struct ieee_types_ibss_param_set *)
1301 current_ptr; 1309 current_ptr;
@@ -1305,10 +1313,14 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter,
1305 break; 1313 break;
1306 1314
1307 case WLAN_EID_ERP_INFO: 1315 case WLAN_EID_ERP_INFO:
1316 if (!element_len)
1317 return -EINVAL;
1308 bss_entry->erp_flags = *(current_ptr + 2); 1318 bss_entry->erp_flags = *(current_ptr + 2);
1309 break; 1319 break;
1310 1320
1311 case WLAN_EID_PWR_CONSTRAINT: 1321 case WLAN_EID_PWR_CONSTRAINT:
1322 if (!element_len)
1323 return -EINVAL;
1312 bss_entry->local_constraint = *(current_ptr + 2); 1324 bss_entry->local_constraint = *(current_ptr + 2);
1313 bss_entry->sensed_11h = true; 1325 bss_entry->sensed_11h = true;
1314 break; 1326 break;
@@ -1349,6 +1361,9 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter,
1349 break; 1361 break;
1350 1362
1351 case WLAN_EID_VENDOR_SPECIFIC: 1363 case WLAN_EID_VENDOR_SPECIFIC:
1364 if (element_len + 2 < sizeof(vendor_ie->vend_hdr))
1365 return -EINVAL;
1366
1352 vendor_ie = (struct ieee_types_vendor_specific *) 1367 vendor_ie = (struct ieee_types_vendor_specific *)
1353 current_ptr; 1368 current_ptr;
1354 1369