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