Skip to contentSkip to conversation

wifi: mac80211: ieee80211_i: Fix memory corruption bug in struct ieee80211_chanctx

PATCH New Gustavo A. R. Silva 1 participant 1 message Oct 25, 2024 mac80211

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 wifi: mac80211: ieee80211_i: Fix memory corruption bug in struct ieee80211_chanctx

Move the struct ieee80211_chanctx_conf conf to the end of struct ieee80211_chanctx and fix a memory corruption bug triggered in hwsim_set_chanctx_magic(): radar_detected is being overwritten when cp->magic = HWSIM_CHANCTX_MAGIC; See the function call sequence below:

drv_add_chanctx(... struct ieee80211_chanctx *ctx) ->

    local->ops->add_chanctx(&local->hw, &ctx->conf) ->
	mac80211_hwsim_add_chanctx(... struct ieee80211_chanctx_conf *ctx) ->
	    hwsim_set_chanctx_magic(ctx)

Also, add a code comment to try to prevent people from introducing new members after struct ieee80211_chanctx_conf conf. Notice that struct ieee80211_chanctx_conf is a flexible structure --a structure that contains a flexible-array member, so it should always be at the end of any other containing structures.

This change also fixes 50 of the following warnings:

net/mac80211/ieee80211_i.h:895:39: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]

-Wflex-array-member-not-at-end was introduced in GCC-14, and we are getting ready to enable it, globally.

Fixes bca8bc0399ac ("wifi: mac80211: handle ieee80211_radar_detected() for MLO")

---
Changes in v2:
- Add Fixes: tag. (Johannes)
- Update Subject line and changelog text to better reflect the severity of this change.

v1:
- Link: https://lore.kernel.org/linux-hardening/Zxv7KtPEy1kvnTPM@kspp/

 net/mac80211/ieee80211_i.h | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
net/mac80211/ieee80211_i.h +3 -2
index e7815ffeaf30..c65adbdf2166 100644
@@ -892,9 +892,10 @@ struct ieee80211_chanctx {
 	/* temporary data for search algorithm etc. */
 	struct ieee80211_chan_req req;
 
-	struct ieee80211_chanctx_conf conf;
-
 	bool radar_detected;
+
+	/* MUST be last - ends in a flexible-array member. */
+	struct ieee80211_chanctx_conf conf;
 };
 
 struct mac80211_qos_map {
Signature · 1 line
2.34.1