diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-07-04 22:41:42 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-07-04 22:41:42 +0200 |
commit | 13abbdf14bda7ef4ee5739d28bb61dc449cf67bc (patch) | |
tree | e3c20a4f7197980ac3841bf1e755b94179a60cf2 | |
parent | f361e59001c8e6d8e61c82151a70c6006dac71d4 (diff) |
tun: windows: delay initial write
Otherwise we provoke Wintun 0.3.
-rw-r--r-- | tun/tun_windows.go | 38 |
1 files 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 { |