aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/data.c
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2016-11-01 20:05:15 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2016-11-01 20:08:14 +0100
commit662b948fec1549edd2cbec521a039fd2f9d34065 (patch)
treec614e53bc6d2493f5a0d1fe0b8f823709d616c79 /src/data.c
parentpeer: kref is most likely to succeed (diff)
downloadwireguard-monolithic-historical-662b948fec1549edd2cbec521a039fd2f9d34065.tar.xz
wireguard-monolithic-historical-662b948fec1549edd2cbec521a039fd2f9d34065.zip
data: do not allow usage of keypair just before hash removal
Diffstat (limited to 'src/data.c')
-rw-r--r--src/data.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/src/data.c b/src/data.c
index 2da5ddd..8738e67 100644
--- a/src/data.c
+++ b/src/data.c
@@ -191,10 +191,9 @@ int packet_create_data(struct sk_buff *skb, struct wireguard_peer *peer, void(*c
unsigned int num_frags;
rcu_read_lock();
- keypair = rcu_dereference(peer->keypairs.current_keypair);
+ keypair = noise_keypair_get(rcu_dereference(peer->keypairs.current_keypair));
if (unlikely(!keypair))
goto err_rcu;
- kref_get(&keypair->refcount);
rcu_read_unlock();
if (unlikely(!get_encryption_nonce(&nonce, &keypair->sending)))
@@ -367,12 +366,11 @@ void packet_consume_data(struct sk_buff *skb, size_t offset, struct wireguard_de
goto err;
ret = -EINVAL;
rcu_read_lock();
- keypair = (struct noise_keypair *)index_hashtable_lookup(&wg->index_hashtable, INDEX_HASHTABLE_KEYPAIR, idx);
+ keypair = noise_keypair_get((struct noise_keypair *)index_hashtable_lookup(&wg->index_hashtable, INDEX_HASHTABLE_KEYPAIR, idx));
if (unlikely(!keypair)) {
rcu_read_unlock();
goto err;
}
- kref_get(&keypair->refcount);
rcu_read_unlock();
#ifdef CONFIG_WIREGUARD_PARALLEL
if (cpumask_weight(cpu_online_mask) > 1) {