summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2018-05-20 06:38:39 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2018-05-20 06:38:39 +0200
commit18f43705ecbc8751bcf5ed05cd65cf93c36798b0 (patch)
tree2d19a90e474449a177e392caeb77388d4f76dbde
parent058cedcf664e3bb553e699a09beda4dc5c1474fa (diff)
Fix race with closing event channel
There's still a tiny race on Linux, since the tun channel is written to from two places.
-rw-r--r--tun_darwin.go3
-rw-r--r--tun_linux.go6
2 files changed, 6 insertions, 3 deletions
diff --git a/tun_darwin.go b/tun_darwin.go
index 23c0b54..d2cdcd5 100644
--- a/tun_darwin.go
+++ b/tun_darwin.go
@@ -53,6 +53,8 @@ func (tun *NativeTun) RoutineRouteListener(tunIfindex int) {
statusMTU int
)
+ defer close(tun.events)
+
data := make([]byte, os.Getpagesize())
for {
n, err := unix.Read(tun.routeSocket, data)
@@ -302,7 +304,6 @@ func (tun *NativeTun) Close() error {
// 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
}
diff --git a/tun_linux.go b/tun_linux.go
index 2782260..f9a27d6 100644
--- a/tun_linux.go
+++ b/tun_linux.go
@@ -89,7 +89,10 @@ func createNetlinkSocket() (int, error) {
}
func (tun *NativeTun) RoutineNetlinkListener() {
- defer unix.Close(tun.netlinkSock)
+ defer func() {
+ unix.Close(tun.netlinkSock)
+ close(tun.events)
+ }()
for msg := make([]byte, 1<<16); ; {
@@ -357,7 +360,6 @@ func (tun *NativeTun) Close() error {
}
err2 := tun.fd.Close()
err3 := tun.fdCancel.Cancel()
- close(tun.events)
if err1 != nil {
return err1