Skip to content

Commit 52009b4

Browse files
nbd168jmberg-intel
authored andcommitted
wifi: mac80211: skip non-uploaded keys in ieee80211_iter_keys
Sync iterator conditions with ieee80211_iter_keys_rcu. Fixes: 830af02 ("mac80211: allow driver to iterate keys") Signed-off-by: Felix Fietkau <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Johannes Berg <[email protected]>
1 parent 57be3d3 commit 52009b4

File tree

1 file changed

+25
-17
lines changed

1 file changed

+25
-17
lines changed

net/mac80211/key.c

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -987,6 +987,26 @@ void ieee80211_reenable_keys(struct ieee80211_sub_if_data *sdata)
987987
}
988988
}
989989

990+
static void
991+
ieee80211_key_iter(struct ieee80211_hw *hw,
992+
struct ieee80211_vif *vif,
993+
struct ieee80211_key *key,
994+
void (*iter)(struct ieee80211_hw *hw,
995+
struct ieee80211_vif *vif,
996+
struct ieee80211_sta *sta,
997+
struct ieee80211_key_conf *key,
998+
void *data),
999+
void *iter_data)
1000+
{
1001+
/* skip keys of station in removal process */
1002+
if (key->sta && key->sta->removed)
1003+
return;
1004+
if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
1005+
return;
1006+
iter(hw, vif, key->sta ? &key->sta->sta : NULL,
1007+
&key->conf, iter_data);
1008+
}
1009+
9901010
void ieee80211_iter_keys(struct ieee80211_hw *hw,
9911011
struct ieee80211_vif *vif,
9921012
void (*iter)(struct ieee80211_hw *hw,
@@ -1005,16 +1025,13 @@ void ieee80211_iter_keys(struct ieee80211_hw *hw,
10051025
if (vif) {
10061026
sdata = vif_to_sdata(vif);
10071027
list_for_each_entry_safe(key, tmp, &sdata->key_list, list)
1008-
iter(hw, &sdata->vif,
1009-
key->sta ? &key->sta->sta : NULL,
1010-
&key->conf, iter_data);
1028+
ieee80211_key_iter(hw, vif, key, iter, iter_data);
10111029
} else {
10121030
list_for_each_entry(sdata, &local->interfaces, list)
10131031
list_for_each_entry_safe(key, tmp,
10141032
&sdata->key_list, list)
1015-
iter(hw, &sdata->vif,
1016-
key->sta ? &key->sta->sta : NULL,
1017-
&key->conf, iter_data);
1033+
ieee80211_key_iter(hw, &sdata->vif, key,
1034+
iter, iter_data);
10181035
}
10191036
}
10201037
EXPORT_SYMBOL(ieee80211_iter_keys);
@@ -1031,17 +1048,8 @@ _ieee80211_iter_keys_rcu(struct ieee80211_hw *hw,
10311048
{
10321049
struct ieee80211_key *key;
10331050

1034-
list_for_each_entry_rcu(key, &sdata->key_list, list) {
1035-
/* skip keys of station in removal process */
1036-
if (key->sta && key->sta->removed)
1037-
continue;
1038-
if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
1039-
continue;
1040-
1041-
iter(hw, &sdata->vif,
1042-
key->sta ? &key->sta->sta : NULL,
1043-
&key->conf, iter_data);
1044-
}
1051+
list_for_each_entry_rcu(key, &sdata->key_list, list)
1052+
ieee80211_key_iter(hw, &sdata->vif, key, iter, iter_data);
10451053
}
10461054

10471055
void ieee80211_iter_keys_rcu(struct ieee80211_hw *hw,

0 commit comments

Comments
 (0)