]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: cfg80211: advance loop vars in cfg80211_merge_profile()
authorJohn Walker <johnwalker0@gmail.com>
Thu, 7 May 2026 23:07:20 +0000 (17:07 -0600)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 8 May 2026 07:20:03 +0000 (09:20 +0200)
cfg80211_merge_profile() reassembles a Multi-BSSID non-transmitted BSS
profile that has been split across multiple consecutive MBSSID elements.
Its while-loop calls

cfg80211_get_profile_continuation(ie, ielen, mbssid_elem, sub_elem)

but never advances mbssid_elem or sub_elem inside the body.  Each
iteration therefore searches for a continuation that follows the same
fixed pair; the helper returns the same next_mbssid; and the same
next_sub bytes are memcpy()'d into merged_ie at a growing offset until
the buffer fills.

Advance both mbssid_elem and sub_elem to the just-consumed continuation
so the next call to cfg80211_get_profile_continuation() searches for a
further continuation beyond it (or returns NULL when none exists).

A specially-crafted malicious beacon can take advantage of this bug
to cause the kernel to spend an excessive amount of time in
cfg80211_merge_profile (up to as much as 2ms per beacon received),
which could theoretically be abused in some way.

Cc: stable@vger.kernel.org
Fixes: fe806e4992c9 ("cfg80211: support profile split between elements")
Signed-off-by: John Walker <johnwalker0@gmail.com>
Link: https://patch.msgid.link/20260507230720.64783-1-johnwalker0@gmail.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/wireless/scan.c

index 328af43ef83251db2a501bf971472a6ef5114935..358cbc9e43d851df926d220e8789d3831e5a28bb 100644 (file)
@@ -2462,6 +2462,9 @@ size_t cfg80211_merge_profile(const u8 *ie, size_t ielen,
                memcpy(merged_ie + copied_len, next_sub->data,
                       next_sub->datalen);
                copied_len += next_sub->datalen;
+
+               mbssid_elem = next_mbssid;
+               sub_elem = next_sub;
        }
 
        return copied_len;