Re: [PATCH] wifi: ath12k: fix channel list double-free on error paths
From: Jeff Johnson
Date: Thu Aug 06 2026 - 21:48:11 EST
On 7/31/2026 2:38 AM, Linkai Gong wrote:
> ath12k_mac_setup_channels_rates() frees band channel arrays on failure
> but either leaves the pointers non-NULL or clears the wrong band. Later
> ath12k_mac_cleanup_unregister() frees the same pointers again.
>
> Clear the correct sbands[].channels pointers after kfree(), including
> a copy-paste bug that nulled 2 GHz after freeing 6 GHz channels.
https://wireless.docs.kernel.org/en/latest/en/users/drivers/ath12k/submittingpatches.html#tested-on-tag
Tested-on: tag missing. How was this tested?
>
> Fixes: acc152f9be20 ("wifi: ath12k: combine channel list for split-phy devices in single-wiphy")
> Signed-off-by: Linkai Gong <gonglinkai@xxxxxxxxxx>
> ---
> drivers/net/wireless/ath/ath12k/mac.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
> index a0928890671a..5468a8d2d5d5 100644
> --- a/drivers/net/wireless/ath/ath12k/mac.c
> +++ b/drivers/net/wireless/ath/ath12k/mac.c
> @@ -14275,6 +14275,7 @@ static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
> sizeof(ath12k_6ghz_channels), GFP_KERNEL);
> if (!channels) {
> kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
> + ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
> return -ENOMEM;
> }
>
> @@ -14325,7 +14326,9 @@ static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
> GFP_KERNEL);
> if (!channels) {
> kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
> + ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
> kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
> + ar->mac.sbands[NL80211_BAND_6GHZ].channels = NULL;
> return -ENOMEM;
> }
>
> @@ -14365,7 +14368,7 @@ static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
> kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
> ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
> kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
> - ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
> + ar->mac.sbands[NL80211_BAND_6GHZ].channels = NULL;
> kfree(channels);
> band->channels = NULL;
> return ret;