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

Updates #17830

Signed-off-by: Jordan Whited <jordan@tailscale.com>
(cherry picked from commit 2ad2d4d409)
pull/17969/head
Jordan Whited 3 weeks ago committed by Jordan Whited
parent e602907cf5
commit 771a9d29ff

@ -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,

Loading…
Cancel
Save