From: Jason A. Donenfeld Date: Tue, 26 Mar 2019 14:57:53 +0000 (+0100) Subject: tun: windows: cancel ongoing reads on closing and delete after close X-Git-Tag: 0.0.20190409~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2e0ed4614addc5e1842cf652c5d23779581ca7f2;p=thirdparty%2Fwireguard-go.git tun: windows: cancel ongoing reads on closing and delete after close This reverts commit 52ec440d7977fad966002c3710ed9df957943407 and adds some spice. --- 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) {