There's still a tiny race on Linux, since the tun channel is written to
from two places.
statusMTU int
)
+ defer close(tun.events)
+
data := make([]byte, os.Getpagesize())
for {
n, err := unix.Read(tun.routeSocket, data)
// We don't even need to call shutdown, or use a rwcancel.
err3 = unix.Close(tun.routeSocket)
}
- close(tun.events)
if err1 != nil {
return err1
}
}
func (tun *NativeTun) RoutineNetlinkListener() {
- defer unix.Close(tun.netlinkSock)
+ defer func() {
+ unix.Close(tun.netlinkSock)
+ close(tun.events)
+ }()
for msg := make([]byte, 1<<16); ; {
}
err2 := tun.fd.Close()
err3 := tun.fdCancel.Cancel()
- close(tun.events)
if err1 != nil {
return err1