tun: windows: delay initial write

Otherwise we provoke Wintun 0.3.
This commit is contained in:
Jason A. Donenfeld 2019-07-04 22:41:42 +02:00
parent f361e59001
commit 13abbdf14b

View file

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