if_wg: fix access to noise_local->l_has_identity and l_private

These members are protected by the identity lock, so rlock it in
noise_remote_alloc() and then assert that we have it held to some extent
in noise_precompute_ss().

PR:		276392
This commit is contained in:
Aaron LI 2024-01-17 23:29:23 +00:00 committed by Kyle Evans
parent b891f61ef5
commit 7a4d1d1df0

View file

@ -281,6 +281,7 @@ noise_local_keys(struct noise_local *l, uint8_t public[NOISE_PUBLIC_KEY_LEN],
static void
noise_precompute_ss(struct noise_local *l, struct noise_remote *r)
{
rw_assert(&l->l_identity_lock, RA_LOCKED);
rw_wlock(&r->r_handshake_lock);
if (!l->l_has_identity ||
!curve25519(r->r_ss, l->l_private, r->r_public))
@ -302,7 +303,10 @@ noise_remote_alloc(struct noise_local *l, void *arg,
r->r_handshake_state = HANDSHAKE_DEAD;
r->r_last_sent = TIMER_RESET;
r->r_last_init_recv = TIMER_RESET;
rw_rlock(&l->l_identity_lock);
noise_precompute_ss(l, r);
rw_runlock(&l->l_identity_lock);
refcount_init(&r->r_refcnt, 1);
r->r_local = noise_local_ref(l);