diff --git a/device/sticky_linux.go b/device/sticky_linux.go index 594cd01..a984f24 100644 --- a/device/sticky_linux.go +++ b/device/sticky_linux.go @@ -49,6 +49,7 @@ func (device *Device) routineRouteListener(bind conn.Bind, netlinkSock int, netl var reqPeer map[uint32]peerEndpointPtr var reqPeerLock sync.Mutex + defer netlinkCancel.Close() defer unix.Close(netlinkSock) for msg := make([]byte, 1<<16); ; { diff --git a/ipc/uapi_linux.go b/ipc/uapi_linux.go index 3213543..e03a00b 100644 --- a/ipc/uapi_linux.go +++ b/ipc/uapi_linux.go @@ -99,6 +99,7 @@ func UAPIListen(name string, file *os.File) (net.Listener, error) { go func(l *UAPIListener) { var buff [0]byte for { + defer uapi.inotifyRWCancel.Close() // start with lstat to avoid race condition if _, err := os.Lstat(socketPath); os.IsNotExist(err) { l.connErr <- err diff --git a/rwcancel/rwcancel.go b/rwcancel/rwcancel.go index 8a6300a..70eb4ca 100644 --- a/rwcancel/rwcancel.go +++ b/rwcancel/rwcancel.go @@ -119,3 +119,8 @@ func (rw *RWCancel) Cancel() (err error) { _, err = rw.closingWriter.Write([]byte{0}) return } + +func (rw *RWCancel) Close() { + rw.closingReader.Close() + rw.closingWriter.Close() +} diff --git a/tun/tun_linux.go b/tun/tun_linux.go index be36c69..501f3a3 100644 --- a/tun/tun_linux.go +++ b/tun/tun_linux.go @@ -106,6 +106,7 @@ func (tun *NativeTun) routineNetlinkListener() { unix.Close(tun.netlinkSock) tun.hackListenerClosed.Lock() close(tun.events) + tun.netlinkCancel.Close() }() for msg := make([]byte, 1<<16); ; {