| From ebee060550bb9a7cd532663e4277da89f6479631 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 4 Jun 2023 12:11:16 +0300 |
| Subject: wifi: mac80211: mlme: fix non-inheritence element |
| |
| From: Johannes Berg <johannes.berg@intel.com> |
| |
| [ Upstream commit 68c228557d52616cf040651abefda9839de7086a ] |
| |
| There were two bugs when creating the non-inheritence |
| element: |
| 1) 'at_extension' needs to be declared outside the loop, |
| otherwise the value resets every iteration and we |
| can never really switch properly |
| 2) 'added' never got set to true, so we always cut off |
| the extension element again at the end of the function |
| |
| This shows another issue that we might add a list but no |
| extension list, but we need to make the extension list a |
| zero-length one in that case. |
| |
| Fix all these issues. While at it, add a comment explaining |
| the trim. |
| |
| Fixes: 81151ce462e5 ("wifi: mac80211: support MLO authentication/association with one link") |
| Signed-off-by: Johannes Berg <johannes.berg@intel.com> |
| Signed-off-by: Gregory Greenman <gregory.greenman@intel.com> |
| Link: https://lore.kernel.org/r/20230604120651.3addaa5c4782.If3a78f9305997ad7ef4ba7ffc17a8234c956f613@changeid |
| Signed-off-by: Johannes Berg <johannes.berg@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/mac80211/mlme.c | 8 +++++++- |
| 1 file changed, 7 insertions(+), 1 deletion(-) |
| |
| diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c |
| index 0125b3e6175b7..dc9e7eb7dd857 100644 |
| --- a/net/mac80211/mlme.c |
| +++ b/net/mac80211/mlme.c |
| @@ -1143,6 +1143,7 @@ static void ieee80211_add_non_inheritance_elem(struct sk_buff *skb, |
| const u16 *inner) |
| { |
| unsigned int skb_len = skb->len; |
| + bool at_extension = false; |
| bool added = false; |
| int i, j; |
| u8 *len, *list_len = NULL; |
| @@ -1154,7 +1155,6 @@ static void ieee80211_add_non_inheritance_elem(struct sk_buff *skb, |
| for (i = 0; i < PRESENT_ELEMS_MAX && outer[i]; i++) { |
| u16 elem = outer[i]; |
| bool have_inner = false; |
| - bool at_extension = false; |
| |
| /* should at least be sorted in the sense of normal -> ext */ |
| WARN_ON(at_extension && elem < PRESENT_ELEM_EXT_OFFS); |
| @@ -1183,8 +1183,14 @@ static void ieee80211_add_non_inheritance_elem(struct sk_buff *skb, |
| } |
| *list_len += 1; |
| skb_put_u8(skb, (u8)elem); |
| + added = true; |
| } |
| |
| + /* if we added a list but no extension list, make a zero-len one */ |
| + if (added && (!at_extension || !list_len)) |
| + skb_put_u8(skb, 0); |
| + |
| + /* if nothing added remove extension element completely */ |
| if (!added) |
| skb_trim(skb, skb_len); |
| else |
| -- |
| 2.39.2 |
| |