tun: windows: serialize write calls

This commit is contained in:
Jason A. Donenfeld 2020-01-07 11:40:45 -05:00
parent 89dd065e53
commit 4fa2ea6a2d

View File

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