summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-02-09 20:18:21 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2021-02-09 20:19:14 +0100
commit6f08a100410fb61093df5321b685b07ff8b801e6 (patch)
treec82b4384d5135c1d3c84f39d979bc2b6066a8d96
parenta97ef39cd4a8a7612ff744ff0e7a4efdf3837214 (diff)
rwcancel: add an explicit close call
This lets us collect FDs even if the GC doesn't do it for us. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r--device/sticky_linux.go1
-rw-r--r--ipc/uapi_linux.go1
-rw-r--r--rwcancel/rwcancel.go5
-rw-r--r--tun/tun_linux.go1
4 files changed, 8 insertions, 0 deletions
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); ; {