2025-03-04, 01:33:39 +0100, Antonio Quartulli wrote:
+struct crypto_aead *ovpn_aead_init(const char *title, const char *alg_name,
const unsigned char *key,
unsigned int keylen)
nit: static? I don't see it used outside this file.
[...]
+static inline struct ovpn_crypto_key_slot * +ovpn_crypto_key_id_to_slot(const struct ovpn_crypto_state *cs, u8 key_id) +{
- struct ovpn_crypto_key_slot *ks;
- u8 idx;
- if (unlikely(!cs))
return NULL;
- rcu_read_lock();
- idx = cs->primary_idx;
I'd go with slots[0] and slots[1], since it doesn't really matter whether we check the primary or secondary first. It would avoid a possible reload of cs->primary_idx (which might be updated concurrently by a key swap and cause us to look into the same slot twice) -- a READ_ONCE would also prevent that.
- ks = rcu_dereference(cs->slots[idx]);
- if (ks && ks->key_id == key_id) {
if (unlikely(!ovpn_crypto_key_slot_hold(ks)))
ks = NULL;
goto out;
- }
- ks = rcu_dereference(cs->slots[!idx]);
- if (ks && ks->key_id == key_id) {
if (unlikely(!ovpn_crypto_key_slot_hold(ks)))
ks = NULL;
goto out;
- }
- /* when both key slots are occupied but no matching key ID is found, ks
* has to be reset to NULL to avoid carrying a stale pointer
*/
- ks = NULL;
+out:
- rcu_read_unlock();
- return ks;
+}