Skip to content

Commit 436ec29

Browse files
committed
brcmfmac: Fix error handling in brcmf_enable_bw40_2g
Previously this could try to free a provider that wasn't initialized. Signed-off-by: Hector Martin <[email protected]>
1 parent 96042ea commit 436ec29

1 file changed

Lines changed: 37 additions & 31 deletions

File tree

  • drivers/net/wireless/broadcom/brcm80211/brcmfmac

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

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7310,42 +7310,48 @@ static int brcmf_enable_bw40_2g(struct brcmf_cfg80211_info *cfg)
73107310
err = brcmf_fil_iovar_int_set(ifp, "mimo_bw_cap", val);
73117311
}
73127312

7313-
if (!err) {
7314-
err = brcmf_init_channel_info_provider(cfg, &prov);
7315-
if (err) {
7316-
bphy_err(
7317-
cfg,
7318-
"Error initializing channel info provider:%d\n",
7319-
err);
7320-
return err;
7321-
}
7313+
if (err) {
7314+
brcmf_dbg(INFO, "failed to set bw_cap\n");
7315+
return err;
7316+
}
73227317

7323-
band = cfg_to_wiphy(cfg)->bands[NL80211_BAND_2GHZ];
7324-
num_chan = prov.get_channel_count(&prov);
7325-
if (num_chan == 0) {
7326-
bphy_err(drvr, "Invalid count of channel Spec. (%u)\n",
7327-
num_chan);
7328-
return -EINVAL;
7329-
}
7318+
err = brcmf_init_channel_info_provider(cfg, &prov);
7319+
if (err) {
7320+
bphy_err(
7321+
cfg,
7322+
"Error initializing channel info provider:%d\n",
7323+
err);
7324+
return err;
7325+
}
73307326

7331-
for (i = 0; i < num_chan; i++) {
7332-
ch.chspec = prov.get_channel_spec(&prov, i);
7333-
cfg->d11inf.decchspec(&ch);
7334-
/* Skip the channels we are not interested in */
7335-
if (ch.band != BRCMU_CHAN_BAND_2G ||
7336-
ch.bw != BRCMU_CHAN_BW_40)
7337-
continue;
7338-
for (j = 0; j < band->n_channels; j++) {
7339-
if (band->channels[j].hw_value ==
7340-
ch.control_ch_num)
7341-
break;
7342-
}
7343-
if (WARN_ON(j == band->n_channels))
7344-
continue;
7327+
band = cfg_to_wiphy(cfg)->bands[NL80211_BAND_2GHZ];
7328+
num_chan = prov.get_channel_count(&prov);
7329+
if (num_chan == 0) {
7330+
bphy_err(drvr, "Invalid count of channel Spec. (%u)\n",
7331+
num_chan);
7332+
err = -EINVAL;
7333+
goto err_free;
7334+
}
73457335

7346-
brcmf_update_bw40_channel_flag(&band->channels[j], &ch);
7336+
for (i = 0; i < num_chan; i++) {
7337+
ch.chspec = prov.get_channel_spec(&prov, i);
7338+
cfg->d11inf.decchspec(&ch);
7339+
/* Skip the channels we are not interested in */
7340+
if (ch.band != BRCMU_CHAN_BAND_2G ||
7341+
ch.bw != BRCMU_CHAN_BW_40)
7342+
continue;
7343+
for (j = 0; j < band->n_channels; j++) {
7344+
if (band->channels[j].hw_value ==
7345+
ch.control_ch_num)
7346+
break;
73477347
}
7348+
if (WARN_ON(j == band->n_channels))
7349+
continue;
7350+
7351+
brcmf_update_bw40_channel_flag(&band->channels[j], &ch);
73487352
}
7353+
7354+
err_free:
73497355
brcmf_free_channel_info_provider(&prov);
73507356
return err;
73517357
}

0 commit comments

Comments
 (0)