mirror of
https://github.com/tailscale/tailscale.git
synced 2026-11-01 23:21:03 -05:00
Add regression guards for the inbound reply paths (TSMP pong, TSMP connection reject, and the conn25 unmapped Transit IP reject) that were made nonblocking via TryInjectOutbound: with the injection queue full and its reader not draining (as when the reader is blocked behind wireguard-go's device.peers lock held by RemovePeer), generating a reply must drop rather than block, because the replying goroutine must complete for the peer teardown to finish. A blocking injection there deadlocks peer removal against inbound packet processing, as in tailscale/corp#45544. The tests run in synctest bubbles: the full queue is the only blocking operation on these paths, so after synctest.Wait the reply either completed or is provably stuck on the queue, and no timeout-based failure is needed. A regressed, blocking sender is unblocked by closing the Wrapper before the test fails, so the bubble settles. Updates tailscale/corp#45544 Updates #21631 Signed-off-by: James Tucker <james@tailscale.com>