FAILED: patch "[PATCH] wifi: mac80211: capture fast-RX rate before mesh reuses" failed to apply to 6.18-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x d71c841be5d9e586ee7f36c0dc8ed4db0d9a1349
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026052854-skimmer-nutlike-eb6e@gregkh' --subject-prefix 'PATCH 6.18.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From d71c841be5d9e586ee7f36c0dc8ed4db0d9a1349 Mon Sep 17 00:00:00 2001
From: Zhao Li <[email protected]>
Date: Sat, 9 May 2026 12:34:28 +0800
Subject: [PATCH] wifi: mac80211: capture fast-RX rate before mesh reuses
skb->cb
ieee80211_invoke_fast_rx() reads RX status through IEEE80211_SKB_RXCB(skb), which aliases the same skb->cb storage that ieee80211_rx_mesh_data() reuses as IEEE80211_TX_INFO. In the unicast forward path, mesh_data does:
info = IEEE80211_SKB_CB(fwd_skb); memset(info, 0, sizeof(*info));
on the same skb the caller still names via rx->skb, then either queues the skb for TX (success) or kfree_skb()'s it (no-route) before returning RX_QUEUED. The caller's RX_QUEUED arm then calls sta_stats_encode_rate(status) on memory that is either zeroed (success path) or freed (no-route path). The latter is KASAN slab-use-after-free in ieee80211_prepare_and_rx_handle.
Fix by encoding the rate from status before invoking ieee80211_rx_mesh_data(), so the RX_QUEUED arm consumes a value captured while status was still backed by valid memory.
net/mac80211/rx.c +5 -1
@@ -4984,6 +4984,7 @@ static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx,u8 sa[ETH_ALEN ]; } addrs__aligned(2) ;struct ieee80211_sta_rx_stats *stats; +u32 encoded_rate;/* for parallel-rx, we need to have DUP_VALIDATED, otherwise we write * to a common data structure; drivers can implement that per queue
@@ -5091,11 +5092,14 @@ static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx,/* push the addresses in front */ memcpy (skb_push (skb,sizeof (addrs)), &addrs,sizeof (addrs)); +/* capture before mesh forward may memset or free skb->cb */ + encoded_rate =sta_stats_encode_rate (status); + res =ieee80211_rx_mesh_data (rx->sdata, rx->sta, rx->skb);switch (res) {case RX_QUEUED : stats->last_rx = jiffies; - stats->last_rate =sta_stats_encode_rate (status); + stats->last_rate = encoded_rate;return true;case RX_CONTINUE :break ;
Hi Greg,
Please drop this for 6.18.y; no backport is needed there.
The failing cherry-pick is expected because the code fixed by d71c841be5d9 ("wifi: mac80211: capture fast-RX rate before mesh reuses skb->cb") is not present in 6.18.y.
In 6.18.y, the fast-RX mesh RX_QUEUED arm is:
res = ieee80211_rx_mesh_data(rx->sdata, rx->sta, rx->skb);
switch (res) {
case RX_QUEUED:
return true;The later vulnerable post-mesh stats update:
stats->last_rx = jiffies; stats->last_rate = sta_stats_encode_rate(status);
was introduced by:
cc18fffa3a517 ("wifi: mac80211: fix missing RX bitrate update for mesh forwarding path")
That code is not in 6.18.y, so d71c841be5d9 is not applicable to 6.18.y.
Thanks,
Zhao