summaryrefslogtreecommitdiffhomepage
path: root/tun
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2019-03-26 15:57:53 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2019-03-26 16:14:32 +0100
commit2e0ed4614addc5e1842cf652c5d23779581ca7f2 (patch)
tree24c8be7eb7ea2d5418fc5fb56fcb0030c1390eb5 /tun
parent2fa80c0cb7453ab830355b4c612192ec3064865c (diff)
tun: windows: cancel ongoing reads on closing and delete after close
This reverts commit 52ec440d7977fad966002c3710ed9df957943407 and adds some spice.
Diffstat (limited to 'tun')
-rw-r--r--tun/tun_windows.go15
1 files changed, 11 insertions, 4 deletions
diff --git a/tun/tun_windows.go b/tun/tun_windows.go
index b7f9947..9428373 100644
--- a/tun/tun_windows.go
+++ b/tun/tun_windows.go
@@ -146,6 +146,7 @@ func (tun *NativeTun) closeTUN() (err error) {
}
t := tun.tunFileRead
tun.tunFileRead = nil
+ windows.CancelIoEx(windows.Handle(t.Fd()), nil)
err = t.Close()
tun.tunLock.Unlock()
break
@@ -158,6 +159,7 @@ func (tun *NativeTun) closeTUN() (err error) {
}
t := tun.tunFileWrite
tun.tunFileWrite = nil
+ windows.CancelIoEx(windows.Handle(t.Fd()), nil)
err2 := t.Close()
tun.tunLock.Unlock()
if err == nil {
@@ -214,13 +216,18 @@ func (tun *NativeTun) Events() chan TUNEvent {
func (tun *NativeTun) Close() error {
tun.close = true
+ err1 := tun.closeTUN()
+
if tun.events != nil {
close(tun.events)
}
- /* We delete it first, before closing, so that the close operations don't hang with the concurrent read operation. */
- _, _, err := tun.wt.DeleteInterface(0)
- tun.closeTUN()
- return err
+
+ _, _, err2 := tun.wt.DeleteInterface(0)
+ if err1 == nil {
+ err1 = err2
+ }
+
+ return err1
}
func (tun *NativeTun) MTU() (int, error) {