]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mac80211: consume only present negotiated TTLM maps
authorMichael Bommarito <michael.bommarito@gmail.com>
Fri, 15 May 2026 15:17:18 +0000 (11:17 -0400)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 20 May 2026 09:20:37 +0000 (11:20 +0200)
ieee80211_tid_to_link_map_size_ok() validates negotiated TTLM elements
against the number of link-map entries indicated by link_map_presence.
ieee80211_parse_neg_ttlm() must consume the same layout.

The parser advanced its cursor for every TID, including TIDs whose
presence bit is clear and therefore have no map bytes in the element.
A sparse map can then make a later present TID read past the validated
element.

The bad bytes land in neg_ttlm->{up,down}link[tid] but are gated by
valid_links before being applied to driver state, so a peer cannot
turn the read into a policy change.  Under KUnit + KASAN with an
exact-sized element allocation the OOB read is reported as a
slab-out-of-bounds; whether the same trigger fires under the
production RX path depends on surrounding allocator state.

Advance the cursor only when the current TID has a map present.

Fixes: 8f500fbc6c65 ("wifi: mac80211: process and save negotiated TID to Link mapping request")
Cc: stable@vger.kernel.org
Assisted-by: Claude:claude-opus-4-7
Signed-off-by: Michael Bommarito <michael.bommarito@gmail.com>
Link: https://patch.msgid.link/20260515151719.1317659-2-michael.bommarito@gmail.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/mlme.c

index ca1d29daf01900e1b6d8ebfedb11b41418ec933c..b98ddfa3003e16a8bcb24327060c49071da5c991 100644 (file)
@@ -8164,6 +8164,7 @@ ieee80211_parse_neg_ttlm(struct ieee80211_sub_if_data *sdata,
                                         "No active links for TID %d", tid);
                                return -EINVAL;
                        }
+                       pos += map_size;
                } else {
                        map = 0;
                }
@@ -8182,7 +8183,6 @@ ieee80211_parse_neg_ttlm(struct ieee80211_sub_if_data *sdata,
                default:
                        return -EINVAL;
                }
-               pos += map_size;
        }
        return 0;
 }