From 4fa2ea6a2dabad50eb5585d0a56c3a6966604fa6 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Tue, 7 Jan 2020 11:40:45 -0500 Subject: tun: windows: serialize write calls --- tun/tun_windows.go | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'tun/tun_windows.go') diff --git a/tun/tun_windows.go b/tun/tun_windows.go index 8fc5174..b16dbb7 100644 --- a/tun/tun_windows.go +++ b/tun/tun_windows.go @@ -9,6 +9,7 @@ import ( "errors" "fmt" "os" + "sync" "sync/atomic" "time" "unsafe" @@ -40,6 +41,7 @@ type NativeTun struct { forcedMTU int rate rateJuggler rings *wintun.RingDescriptor + writeLock sync.Mutex } const WintunPool = wintun.Pool("WireGuard") @@ -219,6 +221,9 @@ func (tun *NativeTun) Write(buff []byte, offset int) (int, error) { tun.rate.update(uint64(packetSize)) alignedPacketSize := wintun.PacketAlign(uint32(unsafe.Sizeof(wintun.PacketHeader{})) + packetSize) + tun.writeLock.Lock() + defer tun.writeLock.Unlock() + buffHead := atomic.LoadUint32(&tun.rings.Receive.Ring.Head) if buffHead >= wintun.PacketCapacity { return 0, os.ErrClosed -- cgit v1.2.3-59-g8ed1b