summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2019-05-29 14:52:19 +0200
committerBen Hutchings <ben@decadent.org.uk>2019-07-09 22:04:21 +0100
commita24ac7326f38ffab2b63141496d075da144cec7d (patch)
tree03c941559412f32c610b407a6663cc01187a1c1c
parent1ea04ca97ab7f4d583949825dd7d55467aa2536f (diff)
downloadlinux-stable-a24ac7326f38ffab2b63141496d075da144cec7d.tar.gz
linux-stable-a24ac7326f38ffab2b63141496d075da144cec7d.tar.bz2
linux-stable-a24ac7326f38ffab2b63141496d075da144cec7d.zip
mwifiex: Fix possible buffer overflows at parsing bss descriptor
commit 13ec7f10b87f5fc04c4ccbd491c94c7980236a74 upstream. mwifiex_update_bss_desc_with_ie() calls memcpy() unconditionally in a couple places without checking the destination size. Since the source is given from user-space, this may trigger a heap buffer overflow. Fix it by putting the length check before performing memcpy(). This fix addresses CVE-2019-3846. Reported-by: huangwen <huangwen@venustech.com.cn> Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Kalle Valo <kvalo@codeaurora.org> [bwh: Backported to 3.16: adjust filename] Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r--drivers/net/wireless/mwifiex/scan.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c
index 45c5b3450cf5..909dd6323edc 100644
--- a/drivers/net/wireless/mwifiex/scan.c
+++ b/drivers/net/wireless/mwifiex/scan.c
@@ -1171,6 +1171,8 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter,
}
switch (element_id) {
case WLAN_EID_SSID:
+ if (element_len > IEEE80211_MAX_SSID_LEN)
+ return -EINVAL;
bss_entry->ssid.ssid_len = element_len;
memcpy(bss_entry->ssid.ssid, (current_ptr + 2),
element_len);
@@ -1180,6 +1182,8 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter,
break;
case WLAN_EID_SUPP_RATES:
+ if (element_len > MWIFIEX_SUPPORTED_RATES)
+ return -EINVAL;
memcpy(bss_entry->data_rates, current_ptr + 2,
element_len);
memcpy(bss_entry->supported_rates, current_ptr + 2,