mirror of
https://github.com/go-gost/x.git
synced 2026-10-19 16:16:32 +00:00
gost#911: two concurrent UDP source sockets over one RUDP reverse tunnel over relay+TLS corrupted echo responses and made the host tear the tunnel down and rebind it every second. The tunnel is a single stream shared by every endpoint multiplexed over it. A datagram frame is not written to that stream atomically — UDPDatagram.WriteTo issues three separate Write calls (RSV/FRAG, SOCKS5 address, payload). Each Write is concurrency-safe on its own, but with several endpoints writing, frames interleave between those calls. A torn frame also leaves half a header in the stream, which the far end reads as io.ErrUnexpectedEOF and answers by rebuilding the whole tunnel. Hold a mutex for the whole frame instead of just the writes the datagram happens to make. Same defect in both udpTunConn copies. Reproduced with the reporter's script: relay+tls concurrent phase went from 44% loss with corrupted payloads and 1.0s gaps to 0.02% loss, no corruption, 0.003s gaps. Plain relay likewise. Single-endpoint high-rate loss (~35% at 14k pps) is unaffected UDP backpressure, not this bug.