Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 38b57988 authored by Felix Fietkau's avatar Felix Fietkau Committed by Harshit Mogalapalli
Browse files

wifi: mac80211: skip non-uploaded keys in ieee80211_iter_keys



[ Upstream commit 52009b419355195912a628d0a9847922e90c348c ]

Sync iterator conditions with ieee80211_iter_keys_rcu.

Fixes: 830af02f ("mac80211: allow driver to iterate keys")
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
Link: https://patch.msgid.link/20241006153630.87885-1-nbd@nbd.name


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
(cherry picked from commit c9cf9510)
Signed-off-by: default avatarVegard Nossum <vegard.nossum@oracle.com>
Signed-off-by: default avatarHarshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
parent db7bbe21
Loading
Loading
Loading
Loading
+25 −17
Original line number Diff line number Diff line
@@ -771,6 +771,26 @@ void ieee80211_reset_crypto_tx_tailroom(struct ieee80211_sub_if_data *sdata)
	mutex_unlock(&sdata->local->key_mtx);
}

static void
ieee80211_key_iter(struct ieee80211_hw *hw,
		   struct ieee80211_vif *vif,
		   struct ieee80211_key *key,
		   void (*iter)(struct ieee80211_hw *hw,
				struct ieee80211_vif *vif,
				struct ieee80211_sta *sta,
				struct ieee80211_key_conf *key,
				void *data),
		   void *iter_data)
{
	/* skip keys of station in removal process */
	if (key->sta && key->sta->removed)
		return;
	if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
		return;
	iter(hw, vif, key->sta ? &key->sta->sta : NULL,
	     &key->conf, iter_data);
}

void ieee80211_iter_keys(struct ieee80211_hw *hw,
			 struct ieee80211_vif *vif,
			 void (*iter)(struct ieee80211_hw *hw,
@@ -790,16 +810,13 @@ void ieee80211_iter_keys(struct ieee80211_hw *hw,
	if (vif) {
		sdata = vif_to_sdata(vif);
		list_for_each_entry_safe(key, tmp, &sdata->key_list, list)
			iter(hw, &sdata->vif,
			     key->sta ? &key->sta->sta : NULL,
			     &key->conf, iter_data);
			ieee80211_key_iter(hw, vif, key, iter, iter_data);
	} else {
		list_for_each_entry(sdata, &local->interfaces, list)
			list_for_each_entry_safe(key, tmp,
						 &sdata->key_list, list)
				iter(hw, &sdata->vif,
				     key->sta ? &key->sta->sta : NULL,
				     &key->conf, iter_data);
				ieee80211_key_iter(hw, &sdata->vif, key,
						   iter, iter_data);
	}
	mutex_unlock(&local->key_mtx);
}
@@ -817,17 +834,8 @@ _ieee80211_iter_keys_rcu(struct ieee80211_hw *hw,
{
	struct ieee80211_key *key;

	list_for_each_entry_rcu(key, &sdata->key_list, list) {
		/* skip keys of station in removal process */
		if (key->sta && key->sta->removed)
			continue;
		if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
			continue;

		iter(hw, &sdata->vif,
		     key->sta ? &key->sta->sta : NULL,
		     &key->conf, iter_data);
	}
	list_for_each_entry_rcu(key, &sdata->key_list, list)
		ieee80211_key_iter(hw, &sdata->vif, key, iter, iter_data);
}

void ieee80211_iter_keys_rcu(struct ieee80211_hw *hw,