]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: mac80211: correctly decode TTLM with default link map
authorBenjamin Berg <benjamin.berg@intel.com>
Thu, 29 Jan 2026 10:33:50 +0000 (11:33 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 29 Jan 2026 10:46:43 +0000 (11:46 +0100)
TID-To-Link Mapping (TTLM) elements do not contain any link mapping
presence indicator if a default mapping is used and parsing needs to be
skipped.

Note that access points should not explicitly report an advertised TTLM
with a default mapping as that is the implied mapping if the element is
not included, this is even the case when switching back to the default
mapping. However, mac80211 would incorrectly parse the frame and would
also read one byte beyond the end of the element.

Reported-by: Ruikai Peng <ruikai@pwno.io>
Closes: https://lore.kernel.org/linux-wireless/CAFD3drMqc9YWvTCSHLyP89AOpBZsHdZ+pak6zVftYoZcUyF7gw@mail.gmail.com
Fixes: 702e80470a33 ("wifi: mac80211: support handling of advertised TID-to-link mapping")
Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
Link: https://patch.msgid.link/20260129113349.d6b96f12c732.I69212a50f0f70db185edd3abefb6f04d3cb3e5ff@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/mlme.c

index b72345c779c0f3821d9eec2fe4356c7f4839c989..73f57b9e0ebf7654324d1bd8f480266037f6c30b 100644 (file)
@@ -8,7 +8,7 @@
  * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
  * Copyright (C) 2015 - 2017 Intel Deutschland GmbH
- * Copyright (C) 2018 - 2025 Intel Corporation
+ * Copyright (C) 2018 - 2026 Intel Corporation
  */
 
 #include <linux/delay.h>
@@ -6190,8 +6190,10 @@ ieee80211_parse_adv_t2l(struct ieee80211_sub_if_data *sdata,
                return -EINVAL;
        }
 
-       link_map_presence = *pos;
-       pos++;
+       if (!(control & IEEE80211_TTLM_CONTROL_DEF_LINK_MAP)) {
+               link_map_presence = *pos;
+               pos++;
+       }
 
        if (control & IEEE80211_TTLM_CONTROL_SWITCH_TIME_PRESENT) {
                ttlm_info->switch_time = get_unaligned_le16(pos);