| .. | .. |
|---|
| 90 | 90 | #define BRCMF_ASSOC_PARAMS_FIXED_SIZE \ |
|---|
| 91 | 91 | (sizeof(struct brcmf_assoc_params_le) - sizeof(u16)) |
|---|
| 92 | 92 | |
|---|
| 93 | +#define BRCMF_MAX_CHANSPEC_LIST \ |
|---|
| 94 | + (BRCMF_DCMD_MEDLEN / sizeof(__le32) - 1) |
|---|
| 95 | + |
|---|
| 93 | 96 | static bool check_vif_up(struct brcmf_cfg80211_vif *vif) |
|---|
| 94 | 97 | { |
|---|
| 95 | 98 | if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state)) { |
|---|
| .. | .. |
|---|
| 1347 | 1350 | { |
|---|
| 1348 | 1351 | struct brcmf_pub *drvr = ifp->drvr; |
|---|
| 1349 | 1352 | struct brcmf_wsec_pmk_le pmk; |
|---|
| 1350 | | - int i, err; |
|---|
| 1353 | + int err; |
|---|
| 1351 | 1354 | |
|---|
| 1352 | | - /* convert to firmware key format */ |
|---|
| 1353 | | - pmk.key_len = cpu_to_le16(pmk_len << 1); |
|---|
| 1354 | | - pmk.flags = cpu_to_le16(BRCMF_WSEC_PASSPHRASE); |
|---|
| 1355 | | - for (i = 0; i < pmk_len; i++) |
|---|
| 1356 | | - snprintf(&pmk.key[2 * i], 3, "%02x", pmk_data[i]); |
|---|
| 1355 | + memset(&pmk, 0, sizeof(pmk)); |
|---|
| 1356 | + |
|---|
| 1357 | + /* pass pmk directly */ |
|---|
| 1358 | + pmk.key_len = cpu_to_le16(pmk_len); |
|---|
| 1359 | + pmk.flags = cpu_to_le16(0); |
|---|
| 1360 | + memcpy(pmk.key, pmk_data, pmk_len); |
|---|
| 1357 | 1361 | |
|---|
| 1358 | 1362 | /* store psk in firmware */ |
|---|
| 1359 | 1363 | err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_WSEC_PMK, |
|---|
| .. | .. |
|---|
| 5831 | 5835 | (struct brcmf_cfg80211_assoc_ielen_le *)cfg->extra_buf; |
|---|
| 5832 | 5836 | req_len = le32_to_cpu(assoc_info->req_len); |
|---|
| 5833 | 5837 | resp_len = le32_to_cpu(assoc_info->resp_len); |
|---|
| 5838 | + if (req_len > WL_EXTRA_BUF_MAX || resp_len > WL_EXTRA_BUF_MAX) { |
|---|
| 5839 | + bphy_err(drvr, "invalid lengths in assoc info: req %u resp %u\n", |
|---|
| 5840 | + req_len, resp_len); |
|---|
| 5841 | + return -EINVAL; |
|---|
| 5842 | + } |
|---|
| 5834 | 5843 | if (req_len) { |
|---|
| 5835 | 5844 | err = brcmf_fil_iovar_data_get(ifp, "assoc_req_ies", |
|---|
| 5836 | 5845 | cfg->extra_buf, |
|---|
| .. | .. |
|---|
| 6459 | 6468 | band->channels[i].flags = IEEE80211_CHAN_DISABLED; |
|---|
| 6460 | 6469 | |
|---|
| 6461 | 6470 | total = le32_to_cpu(list->count); |
|---|
| 6471 | + if (total > BRCMF_MAX_CHANSPEC_LIST) { |
|---|
| 6472 | + bphy_err(drvr, "Invalid count of channel Spec. (%u)\n", |
|---|
| 6473 | + total); |
|---|
| 6474 | + err = -EINVAL; |
|---|
| 6475 | + goto fail_pbuf; |
|---|
| 6476 | + } |
|---|
| 6477 | + |
|---|
| 6462 | 6478 | for (i = 0; i < total; i++) { |
|---|
| 6463 | 6479 | ch.chspec = (u16)le32_to_cpu(list->element[i]); |
|---|
| 6464 | 6480 | cfg->d11inf.decchspec(&ch); |
|---|
| .. | .. |
|---|
| 6604 | 6620 | band = cfg_to_wiphy(cfg)->bands[NL80211_BAND_2GHZ]; |
|---|
| 6605 | 6621 | list = (struct brcmf_chanspec_list *)pbuf; |
|---|
| 6606 | 6622 | num_chan = le32_to_cpu(list->count); |
|---|
| 6623 | + if (num_chan > BRCMF_MAX_CHANSPEC_LIST) { |
|---|
| 6624 | + bphy_err(drvr, "Invalid count of channel Spec. (%u)\n", |
|---|
| 6625 | + num_chan); |
|---|
| 6626 | + kfree(pbuf); |
|---|
| 6627 | + return -EINVAL; |
|---|
| 6628 | + } |
|---|
| 6629 | + |
|---|
| 6607 | 6630 | for (i = 0; i < num_chan; i++) { |
|---|
| 6608 | 6631 | ch.chspec = (u16)le32_to_cpu(list->element[i]); |
|---|
| 6609 | 6632 | cfg->d11inf.decchspec(&ch); |
|---|