]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
tun: windows: cancel ongoing reads on closing and delete after close
authorJason A. Donenfeld <Jason@zx2c4.com>
Tue, 26 Mar 2019 14:57:53 +0000 (15:57 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Tue, 26 Mar 2019 15:14:32 +0000 (16:14 +0100)
This reverts commit 52ec440d7977fad966002c3710ed9df957943407 and adds
some spice.

tun/tun_windows.go

index b7f99478b14606d74e3c8f329db757c4fb6f293b..9428373a16381f2a35c1d0e090a754ad767089e1 100644 (file)
@@ -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) {