tun: windows: delay initial write
Otherwise we provoke Wintun 0.3.
This commit is contained in:
parent
f361e59001
commit
13abbdf14b
|
@ -11,6 +11,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
@ -41,6 +42,7 @@ type NativeTun struct {
|
||||||
wt *wintun.Wintun
|
wt *wintun.Wintun
|
||||||
tunFileRead *os.File
|
tunFileRead *os.File
|
||||||
tunFileWrite *os.File
|
tunFileWrite *os.File
|
||||||
|
haveRegisteredWriteBuffer int32
|
||||||
tunLock sync.Mutex
|
tunLock sync.Mutex
|
||||||
close bool
|
close bool
|
||||||
rdBuff *exchgBufRead
|
rdBuff *exchgBufRead
|
||||||
|
@ -140,12 +142,7 @@ func (tun *NativeTun) openTUN() error {
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
firstSize := (*uint32)(unsafe.Pointer(&tun.wrBuff.data[0]))
|
atomic.StoreInt32(&tun.haveRegisteredWriteBuffer, 0)
|
||||||
saved := *firstSize
|
|
||||||
*firstSize = 0
|
|
||||||
// Set the maximum buffer length with an invalid write.
|
|
||||||
tun.tunFileWrite.Write(tun.wrBuff.data[:])
|
|
||||||
*firstSize = saved
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -324,6 +321,15 @@ func (tun *NativeTun) Flush() error {
|
||||||
return err
|
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 {
|
for {
|
||||||
_, err = file.Write(tun.wrBuff.data[:tun.wrBuff.offset])
|
_, err = file.Write(tun.wrBuff.data[:tun.wrBuff.offset])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in a new issue