Commit d6015b27 authored by Michal Kazior's avatar Michal Kazior Committed by Kalle Valo

ath10k: fix memleak in mac setup

In some cases channel arrays were never freed.

The patch also unifies error handling in the mac
setup function.
Signed-off-by: default avatarMichal Kazior <michal.kazior@tieto.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 21bf9112
...@@ -3225,8 +3225,10 @@ int ath10k_mac_register(struct ath10k *ar) ...@@ -3225,8 +3225,10 @@ int ath10k_mac_register(struct ath10k *ar)
channels = kmemdup(ath10k_2ghz_channels, channels = kmemdup(ath10k_2ghz_channels,
sizeof(ath10k_2ghz_channels), sizeof(ath10k_2ghz_channels),
GFP_KERNEL); GFP_KERNEL);
if (!channels) if (!channels) {
return -ENOMEM; ret = -ENOMEM;
goto err_free;
}
band = &ar->mac.sbands[IEEE80211_BAND_2GHZ]; band = &ar->mac.sbands[IEEE80211_BAND_2GHZ];
band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels); band->n_channels = ARRAY_SIZE(ath10k_2ghz_channels);
...@@ -3245,11 +3247,8 @@ int ath10k_mac_register(struct ath10k *ar) ...@@ -3245,11 +3247,8 @@ int ath10k_mac_register(struct ath10k *ar)
sizeof(ath10k_5ghz_channels), sizeof(ath10k_5ghz_channels),
GFP_KERNEL); GFP_KERNEL);
if (!channels) { if (!channels) {
if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) { ret = -ENOMEM;
band = &ar->mac.sbands[IEEE80211_BAND_2GHZ]; goto err_free;
kfree(band->channels);
}
return -ENOMEM;
} }
band = &ar->mac.sbands[IEEE80211_BAND_5GHZ]; band = &ar->mac.sbands[IEEE80211_BAND_5GHZ];
...@@ -3313,25 +3312,30 @@ int ath10k_mac_register(struct ath10k *ar) ...@@ -3313,25 +3312,30 @@ int ath10k_mac_register(struct ath10k *ar)
ath10k_reg_notifier); ath10k_reg_notifier);
if (ret) { if (ret) {
ath10k_err("Regulatory initialization failed\n"); ath10k_err("Regulatory initialization failed\n");
return ret; goto err_free;
} }
ret = ieee80211_register_hw(ar->hw); ret = ieee80211_register_hw(ar->hw);
if (ret) { if (ret) {
ath10k_err("ieee80211 registration failed: %d\n", ret); ath10k_err("ieee80211 registration failed: %d\n", ret);
return ret; goto err_free;
} }
if (!ath_is_world_regd(&ar->ath_common.regulatory)) { if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
ret = regulatory_hint(ar->hw->wiphy, ret = regulatory_hint(ar->hw->wiphy,
ar->ath_common.regulatory.alpha2); ar->ath_common.regulatory.alpha2);
if (ret) if (ret)
goto exit; goto err_unregister;
} }
return 0; return 0;
exit:
err_unregister:
ieee80211_unregister_hw(ar->hw); ieee80211_unregister_hw(ar->hw);
err_free:
kfree(ar->mac.sbands[IEEE80211_BAND_2GHZ].channels);
kfree(ar->mac.sbands[IEEE80211_BAND_5GHZ].channels);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment