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:
parent
b891f61ef5
commit
7a4d1d1df0
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue