diff options
author | Jann Horn <jann@thejh.net> | 2018-08-01 04:18:27 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-08-01 05:53:31 +0200 |
commit | afd339581cc169de843b9fd609e8d3a6176c29d3 (patch) | |
tree | 4331f0c0b805704ea0cdfd60570d7683168d3e8a /src | |
parent | 97919beadae1fd9f4b2769233cd6704a1a520450 (diff) |
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>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/allowedips.c | 6 |
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; } |