Skip to content

Commit 17df645

Browse files
Arend Van SprielKalle Valo
authored andcommitted
brcmfmac: add length check in brcmf_cfg80211_escan_handler()
Upon handling the firmware notification for scans the length was checked properly and may result in corrupting kernel heap memory due to buffer overruns. This fix addresses CVE-2017-0786. Cc: [email protected] # v4.0.x Cc: Kevin Cernekee <[email protected]> Reviewed-by: Hante Meuleman <[email protected]> Reviewed-by: Pieter-Paul Giesberts <[email protected]> Reviewed-by: Franky Lin <[email protected]> Signed-off-by: Arend van Spriel <[email protected]> Signed-off-by: Kalle Valo <[email protected]>
1 parent 4c707c0 commit 17df645

File tree

1 file changed

+15
-3
lines changed
  • drivers/net/wireless/broadcom/brcm80211/brcmfmac

1 file changed

+15
-3
lines changed

drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3162,6 +3162,7 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
31623162
struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
31633163
s32 status;
31643164
struct brcmf_escan_result_le *escan_result_le;
3165+
u32 escan_buflen;
31653166
struct brcmf_bss_info_le *bss_info_le;
31663167
struct brcmf_bss_info_le *bss = NULL;
31673168
u32 bi_length;
@@ -3181,11 +3182,23 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
31813182

31823183
if (status == BRCMF_E_STATUS_PARTIAL) {
31833184
brcmf_dbg(SCAN, "ESCAN Partial result\n");
3185+
if (e->datalen < sizeof(*escan_result_le)) {
3186+
brcmf_err("invalid event data length\n");
3187+
goto exit;
3188+
}
31843189
escan_result_le = (struct brcmf_escan_result_le *) data;
31853190
if (!escan_result_le) {
31863191
brcmf_err("Invalid escan result (NULL pointer)\n");
31873192
goto exit;
31883193
}
3194+
escan_buflen = le32_to_cpu(escan_result_le->buflen);
3195+
if (escan_buflen > BRCMF_ESCAN_BUF_SIZE ||
3196+
escan_buflen > e->datalen ||
3197+
escan_buflen < sizeof(*escan_result_le)) {
3198+
brcmf_err("Invalid escan buffer length: %d\n",
3199+
escan_buflen);
3200+
goto exit;
3201+
}
31893202
if (le16_to_cpu(escan_result_le->bss_count) != 1) {
31903203
brcmf_err("Invalid bss_count %d: ignoring\n",
31913204
escan_result_le->bss_count);
@@ -3202,9 +3215,8 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
32023215
}
32033216

32043217
bi_length = le32_to_cpu(bss_info_le->length);
3205-
if (bi_length != (le32_to_cpu(escan_result_le->buflen) -
3206-
WL_ESCAN_RESULTS_FIXED_SIZE)) {
3207-
brcmf_err("Invalid bss_info length %d: ignoring\n",
3218+
if (bi_length != escan_buflen - WL_ESCAN_RESULTS_FIXED_SIZE) {
3219+
brcmf_err("Ignoring invalid bss_info length: %d\n",
32083220
bi_length);
32093221
goto exit;
32103222
}

0 commit comments

Comments
 (0)