wgengine/magicsock: fix UDPRelayAllocReq/Resp deadlock (#17831)

Updates #17830

Signed-off-by: Jordan Whited <jordan@tailscale.com>
This commit is contained in:
Jordan Whited 2025-11-10 21:08:13 -08:00 committed by GitHub
parent 18806de400
commit 2ad2d4d409
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -2444,7 +2444,10 @@ func (c *Conn) handleDiscoMessage(msg []byte, src epAddr, shouldBeRelayHandshake
if !nodeHasCap(c.filt, c.peers.At(peerI), c.self, tailcfg.PeerCapabilityRelay) {
return
}
c.allocRelayEndpointPub.Publish(UDPRelayAllocReq{
// [Conn.mu] must not be held while publishing, or [Conn.onUDPRelayAllocResp]
// can deadlock as the req sub and resp pub are the same goroutine.
// See #17830.
go c.allocRelayEndpointPub.Publish(UDPRelayAllocReq{
RxFromDiscoKey: sender,
RxFromNodeKey: nodeKey,
Message: req,