From: Jun Yang <juny24602@gmail.com>
To: Jason@zx2c4.com, andrew+netdev@lunn.ch
Cc: davem@davemloft.net, edumazet@kernel.org, kuba@kernel.org,
pabeni@redhat.com, wireguard@lists.zx2c4.com,
netdev@vger.kernel.org, Jun Yang <junvyyang@tencent.com>,
stable@kernel.org, TencentOS Corvus AI <corvus@tencent.com>
Subject: [PATCH net] wireguard: flush endpoint dst cache when a peer is removed
Date: Fri, 6 Nov 2026 16:15:17 +0800 [thread overview]
Message-ID: <20261106081538.69465-1-juny24602@gmail.com> (raw)
From: Jun Yang <junvyyang@tencent.com>
peer_make_dead() removes a peer from wg->peer_list, but a netlink device
dump can keep it alive through ctx->next_peer. If the WireGuard device
has moved to another network namespace, wg_netns_exit_rtnl() skips the
removed peer when flushing endpoint caches for the original namespace.
A cached IPv6 RTF_CACHE dst can then survive ip6_route_net_exit(), and
its later release from rcu_release() accesses the destroyed per-netns
dst counter.
Mark the peer dead and flush its endpoint cache under endpoint_lock.
Bypass the cache for dead peers in the send path so an in-flight sender
cannot repopulate it after the flush.
Fixes: 20ae1d6aa159 ("wireguard: device: reset peer src endpoint when netns exits")
Cc: stable@kernel.org
Reported-by: TencentOS Corvus AI <corvus@tencent.com>
Signed-off-by: Jun Yang <junvyyang@tencent.com>
---
A KASAN reproducer for this issue is available if requested.
drivers/net/wireguard/peer.c | 5 ++++-
drivers/net/wireguard/socket.c | 6 ++++--
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireguard/peer.c b/drivers/net/wireguard/peer.c
index 1cb502a932e0..c8d9396b1f13 100644
--- a/drivers/net/wireguard/peer.c
+++ b/drivers/net/wireguard/peer.c
@@ -85,8 +85,11 @@ static void peer_make_dead(struct wg_peer *peer)
&peer->device->device_update_lock);
wg_pubkey_hashtable_remove(peer->device->peer_hashtable, peer);
- /* Mark as dead, so that we don't allow jumping contexts after. */
+ /* Mark as dead and flush the cache before the peer's netns exits. */
+ write_lock_bh(&peer->endpoint_lock);
WRITE_ONCE(peer->is_dead, true);
+ dst_cache_reset_now(&peer->endpoint_cache);
+ write_unlock_bh(&peer->endpoint_lock);
/* The caller must now synchronize_net() for this to take effect. */
}
diff --git a/drivers/net/wireguard/socket.c b/drivers/net/wireguard/socket.c
index 0028ef17dc71..0cd916d480b2 100644
--- a/drivers/net/wireguard/socket.c
+++ b/drivers/net/wireguard/socket.c
@@ -167,15 +167,17 @@ out:
int wg_socket_send_skb_to_peer(struct wg_peer *peer, struct sk_buff *skb, u8 ds)
{
size_t skb_len = skb->len;
+ struct dst_cache *cache;
int ret = -EAFNOSUPPORT;
read_lock_bh(&peer->endpoint_lock);
+ cache = READ_ONCE(peer->is_dead) ? NULL : &peer->endpoint_cache;
if (peer->endpoint.addr.sa_family == AF_INET)
ret = send4(peer->device, skb, &peer->endpoint, ds,
- &peer->endpoint_cache);
+ cache);
else if (peer->endpoint.addr.sa_family == AF_INET6)
ret = send6(peer->device, skb, &peer->endpoint, ds,
- &peer->endpoint_cache);
+ cache);
else
dev_kfree_skb(skb);
if (likely(!ret))
--
2.43.7
next reply other threads:[~2026-11-06 8:15 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-06 8:15 Jun Yang [this message]
2026-11-10 16:56 ` [PATCH net] wireguard: flush endpoint dst cache when a peer is removed Jason A. Donenfeld
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261106081538.69465-1-juny24602@gmail.com \
--to=juny24602@gmail.com \
--cc=Jason@zx2c4.com \
--cc=andrew+netdev@lunn.ch \
--cc=corvus@tencent.com \
--cc=davem@davemloft.net \
--cc=edumazet@kernel.org \
--cc=junvyyang@tencent.com \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=stable@kernel.org \
--cc=wireguard@lists.zx2c4.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.