summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2018-05-21 03:31:44 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2018-05-21 03:31:46 +0200
commit6307bfcdf4616c87b791fc002004526de5511d8f (patch)
treebca77e67bc23d0789d4efc12294b38dfc77fb60e
parente28d70f5b2a00af75aa9f283e31c7da31a2913df (diff)
Close hack listener before closing channel
-rw-r--r--tun_linux.go24
1 files changed, 14 insertions, 10 deletions
diff --git a/tun_linux.go b/tun_linux.go
index f9a27d6..f5b24dc 100644
--- a/tun_linux.go
+++ b/tun_linux.go
@@ -22,6 +22,7 @@ import (
"net"
"os"
"strconv"
+ "sync"
"time"
"unsafe"
)
@@ -32,16 +33,16 @@ const (
)
type NativeTun struct {
- fd *os.File
- fdCancel *rwcancel.RWCancel
- index int32 // if index
- name string // name of interface
- errors chan error // async error handling
- events chan TUNEvent // device related events
- nopi bool // the device was pased IFF_NO_PI
- netlinkSock int
- netlinkCancel *rwcancel.RWCancel
-
+ fd *os.File
+ fdCancel *rwcancel.RWCancel
+ index int32 // if index
+ name string // name of interface
+ errors chan error // async error handling
+ events chan TUNEvent // device related events
+ nopi bool // the device was pased IFF_NO_PI
+ netlinkSock int
+ netlinkCancel *rwcancel.RWCancel
+ hackListenerClosed sync.Mutex
statusListenersShutdown chan struct{}
}
@@ -50,6 +51,7 @@ func (tun *NativeTun) File() *os.File {
}
func (tun *NativeTun) RoutineHackListener() {
+ defer tun.hackListenerClosed.Unlock()
/* This is needed for the detection to work across network namespaces
* If you are reading this and know a better method, please get in touch.
*/
@@ -91,6 +93,7 @@ func createNetlinkSocket() (int, error) {
func (tun *NativeTun) RoutineNetlinkListener() {
defer func() {
unix.Close(tun.netlinkSock)
+ tun.hackListenerClosed.Lock()
close(tun.events)
}()
@@ -455,6 +458,7 @@ func CreateTUNFromFile(fd *os.File) (TUNDevice, error) {
return nil, err
}
+ tun.hackListenerClosed.Lock()
go tun.RoutineNetlinkListener()
go tun.RoutineHackListener() // cross namespace