Commit 0e204508 authored by Qianfeng Rong's avatar Qianfeng Rong Committed by Johannes Berg
Browse files

wifi: mwifiex: Initialize the chan_stats array to zero



The adapter->chan_stats[] array is initialized in
mwifiex_init_channel_scan_gap() with vmalloc(), which doesn't zero out
memory.  The array is filled in mwifiex_update_chan_statistics()
and then the user can query the data in mwifiex_cfg80211_dump_survey().

There are two potential issues here.  What if the user calls
mwifiex_cfg80211_dump_survey() before the data has been filled in.
Also the mwifiex_update_chan_statistics() function doesn't necessarily
initialize the whole array.  Since the array was not initialized at
the start that could result in an information leak.

Also this array is pretty small.  It's a maximum of 900 bytes so it's
more appropriate to use kcalloc() instead vmalloc().

Cc: stable@vger.kernel.org
Fixes: bf354433 ("mwifiex: channel statistics support for mwifiex")
Suggested-by: default avatarDan Carpenter <dan.carpenter@linaro.org>
Signed-off-by: default avatarQianfeng Rong <rongqianfeng@vivo.com>
Reviewed-by: default avatarDan Carpenter <dan.carpenter@linaro.org>
Link: https://patch.msgid.link/20250815023055.477719-1-rongqianfeng@vivo.com


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 75575e2d
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -4673,8 +4673,9 @@ int mwifiex_init_channel_scan_gap(struct mwifiex_adapter *adapter)
	 * additional active scan request for hidden SSIDs on passive channels.
	 */
	adapter->num_in_chan_stats = 2 * (n_channels_bg + n_channels_a);
	adapter->chan_stats = vmalloc(array_size(sizeof(*adapter->chan_stats),
						 adapter->num_in_chan_stats));
	adapter->chan_stats = kcalloc(adapter->num_in_chan_stats,
				      sizeof(*adapter->chan_stats),
				      GFP_KERNEL);

	if (!adapter->chan_stats)
		return -ENOMEM;
+2 −2
Original line number Diff line number Diff line
@@ -642,7 +642,7 @@ static int _mwifiex_fw_dpc(const struct firmware *firmware, void *context)
	goto done;

err_add_intf:
	vfree(adapter->chan_stats);
	kfree(adapter->chan_stats);
err_init_chan_scan:
	wiphy_unregister(adapter->wiphy);
	wiphy_free(adapter->wiphy);
@@ -1485,7 +1485,7 @@ static void mwifiex_uninit_sw(struct mwifiex_adapter *adapter)
	wiphy_free(adapter->wiphy);
	adapter->wiphy = NULL;

	vfree(adapter->chan_stats);
	kfree(adapter->chan_stats);
	mwifiex_free_cmd_buffers(adapter);
}