Skip to content

Commit 6721969

Browse files
Arend Van Sprielgregkh
authored andcommitted
brcmfmac: add length check in brcmf_cfg80211_escan_handler()
commit 17df6453d4be17910456e99c5a85025aa1b7a246 upstream. 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: Kevin Cernekee <cernekee@chromium.org> Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> Reviewed-by: Franky Lin <franky.lin@broadcom.com> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 69f53f5 commit 6721969

1 file changed

Lines changed: 15 additions & 3 deletions

File tree

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2903,6 +2903,7 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
29032903
struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
29042904
s32 status;
29052905
struct brcmf_escan_result_le *escan_result_le;
2906+
u32 escan_buflen;
29062907
struct brcmf_bss_info_le *bss_info_le;
29072908
struct brcmf_bss_info_le *bss = NULL;
29082909
u32 bi_length;
@@ -2919,11 +2920,23 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
29192920

29202921
if (status == BRCMF_E_STATUS_PARTIAL) {
29212922
brcmf_dbg(SCAN, "ESCAN Partial result\n");
2923+
if (e->datalen < sizeof(*escan_result_le)) {
2924+
brcmf_err("invalid event data length\n");
2925+
goto exit;
2926+
}
29222927
escan_result_le = (struct brcmf_escan_result_le *) data;
29232928
if (!escan_result_le) {
29242929
brcmf_err("Invalid escan result (NULL pointer)\n");
29252930
goto exit;
29262931
}
2932+
escan_buflen = le32_to_cpu(escan_result_le->buflen);
2933+
if (escan_buflen > WL_ESCAN_BUF_SIZE ||
2934+
escan_buflen > e->datalen ||
2935+
escan_buflen < sizeof(*escan_result_le)) {
2936+
brcmf_err("Invalid escan buffer length: %d\n",
2937+
escan_buflen);
2938+
goto exit;
2939+
}
29272940
if (le16_to_cpu(escan_result_le->bss_count) != 1) {
29282941
brcmf_err("Invalid bss_count %d: ignoring\n",
29292942
escan_result_le->bss_count);
@@ -2940,9 +2953,8 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
29402953
}
29412954

29422955
bi_length = le32_to_cpu(bss_info_le->length);
2943-
if (bi_length != (le32_to_cpu(escan_result_le->buflen) -
2944-
WL_ESCAN_RESULTS_FIXED_SIZE)) {
2945-
brcmf_err("Invalid bss_info length %d: ignoring\n",
2956+
if (bi_length != escan_buflen - WL_ESCAN_RESULTS_FIXED_SIZE) {
2957+
brcmf_err("Ignoring invalid bss_info length: %d\n",
29462958
bi_length);
29472959
goto exit;
29482960
}

0 commit comments

Comments
 (0)