From 13abbdf14bda7ef4ee5739d28bb61dc449cf67bc Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Thu, 4 Jul 2019 22:41:42 +0200 Subject: [PATCH] tun: windows: delay initial write Otherwise we provoke Wintun 0.3. --- tun/tun_windows.go | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/tun/tun_windows.go b/tun/tun_windows.go index 543482e..613bc9f 100644 --- a/tun/tun_windows.go +++ b/tun/tun_windows.go @@ -11,6 +11,7 @@ import ( "io" "os" "sync" + "sync/atomic" "time" "unsafe" @@ -38,16 +39,17 @@ type exchgBufWrite struct { } type NativeTun struct { - wt *wintun.Wintun - tunFileRead *os.File - tunFileWrite *os.File - tunLock sync.Mutex - close bool - rdBuff *exchgBufRead - wrBuff *exchgBufWrite - events chan Event - errors chan error - forcedMTU int + wt *wintun.Wintun + tunFileRead *os.File + tunFileWrite *os.File + haveRegisteredWriteBuffer int32 + tunLock sync.Mutex + close bool + rdBuff *exchgBufRead + wrBuff *exchgBufWrite + events chan Event + errors chan error + forcedMTU int } func packetAlign(size uint32) uint32 { @@ -140,12 +142,7 @@ func (tun *NativeTun) openTUN() error { } return err } - firstSize := (*uint32)(unsafe.Pointer(&tun.wrBuff.data[0])) - saved := *firstSize - *firstSize = 0 - // Set the maximum buffer length with an invalid write. - tun.tunFileWrite.Write(tun.wrBuff.data[:]) - *firstSize = saved + atomic.StoreInt32(&tun.haveRegisteredWriteBuffer, 0) } return nil } @@ -324,6 +321,15 @@ func (tun *NativeTun) Flush() error { return err } + if atomic.CompareAndSwapInt32(&tun.haveRegisteredWriteBuffer, 0, 1) { + firstSize := (*uint32)(unsafe.Pointer(&tun.wrBuff.data[0])) + saved := *firstSize + *firstSize = 0 + // Set the maximum buffer length with an invalid write. + tun.tunFileWrite.Write(tun.wrBuff.data[:]) + *firstSize = saved + } + for { _, err = file.Write(tun.wrBuff.data[:tun.wrBuff.offset]) if err != nil {