|
|
@@ -1361,21 +1361,25 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter,
|
|
|
break;
|
|
|
|
|
|
case WLAN_EID_VENDOR_SPECIFIC:
|
|
|
- if (element_len + 2 < sizeof(vendor_ie->vend_hdr))
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
vendor_ie = (struct ieee_types_vendor_specific *)
|
|
|
current_ptr;
|
|
|
|
|
|
- if (!memcmp
|
|
|
- (vendor_ie->vend_hdr.oui, wpa_oui,
|
|
|
- sizeof(wpa_oui))) {
|
|
|
+ /* 802.11 requires at least 3-byte OUI. */
|
|
|
+ if (element_len < sizeof(vendor_ie->vend_hdr.oui.oui))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ /* Not long enough for a match? Skip it. */
|
|
|
+ if (element_len < sizeof(wpa_oui))
|
|
|
+ break;
|
|
|
+
|
|
|
+ if (!memcmp(&vendor_ie->vend_hdr.oui, wpa_oui,
|
|
|
+ sizeof(wpa_oui))) {
|
|
|
bss_entry->bcn_wpa_ie =
|
|
|
(struct ieee_types_vendor_specific *)
|
|
|
current_ptr;
|
|
|
bss_entry->wpa_offset = (u16)
|
|
|
(current_ptr - bss_entry->beacon_buf);
|
|
|
- } else if (!memcmp(vendor_ie->vend_hdr.oui, wmm_oui,
|
|
|
+ } else if (!memcmp(&vendor_ie->vend_hdr.oui, wmm_oui,
|
|
|
sizeof(wmm_oui))) {
|
|
|
if (total_ie_len ==
|
|
|
sizeof(struct ieee_types_wmm_parameter) ||
|