aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
authorJann Horn <jann@thejh.net>2018-08-01 04:18:27 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2018-08-01 05:53:31 +0200
commit547194e48035f064ddebcf6ef7285229e38a025d (patch)
treec1eb840af9c62c4049fa420c69379820039a6a05 /src
parentallowedips: prevent double read in kref (diff)
downloadwireguard-monolithic-historical-547194e48035f064ddebcf6ef7285229e38a025d.tar.xz
wireguard-monolithic-historical-547194e48035f064ddebcf6ef7285229e38a025d.zip
allowedips: avoid window of disappeared peer
If a peer is removed, it's possible for a lookup to momentarily return NULL, resulting in needless -ENOKEY returns. Signed-off-by: Jann Horn <jannh@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/allowedips.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/allowedips.c b/src/allowedips.c
index d545be4..634cfb6 100644
--- a/src/allowedips.c
+++ b/src/allowedips.c
@@ -180,9 +180,13 @@ static __always_inline struct wireguard_peer *lookup(struct allowedips_node __rc
swap_endian(ip, be_ip, bits);
rcu_read_lock_bh();
+retry:
node = find_node(rcu_dereference_bh(root), bits, ip);
- if (node)
+ if (node) {
peer = peer_get_maybe_zero(rcu_dereference_bh(node->peer));
+ if (!peer)
+ goto retry;
+ }
rcu_read_unlock_bh();
return peer;
}