Commit df523e7a authored by Arend Van Spriel's avatar Arend Van Spriel Committed by Ben Hutchings

brcmfmac: avoid potential stack overflow in brcmf_cfg80211_start_ap()

commit ded89912 upstream.

User-space can choose to omit NL80211_ATTR_SSID and only provide raw
IE TLV data. When doing so it can provide SSID IE with length exceeding
the allowed size. The driver further processes this IE copying it
into a local variable without checking the length. Hence stack can be
corrupted and used as exploit.
Reported-by: default avatarDaxing Guo <freener.gdx@gmail.com>
Reviewed-by: default avatarHante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: default avatarPieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: default avatarFranky Lin <franky.lin@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
[bwh: Backported to 3.16: adjust filename]
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
parent 88eadd91
...@@ -3822,7 +3822,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev, ...@@ -3822,7 +3822,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
(u8 *)&settings->beacon.head[ie_offset], (u8 *)&settings->beacon.head[ie_offset],
settings->beacon.head_len - ie_offset, settings->beacon.head_len - ie_offset,
WLAN_EID_SSID); WLAN_EID_SSID);
if (!ssid_ie) if (!ssid_ie || ssid_ie->len > IEEE80211_MAX_SSID_LEN)
return -EINVAL; return -EINVAL;
memcpy(ssid_le.SSID, ssid_ie->data, ssid_ie->len); memcpy(ssid_le.SSID, ssid_ie->data, ssid_ie->len);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment