]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
Fix race with closing event channel
authorJason A. Donenfeld <Jason@zx2c4.com>
Sun, 20 May 2018 04:38:39 +0000 (06:38 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Sun, 20 May 2018 04:38:39 +0000 (06:38 +0200)
There's still a tiny race on Linux, since the tun channel is written to
from two places.

tun_darwin.go
tun_linux.go

index 23c0b546324b6c79aaba99064eddf8b74acad357..d2cdcd5c3d4afbbffeb06305e97be53f5abad418 100644 (file)
@@ -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
        }
index 27822608beaefcf99436f7ede121fffa26bea057..f9a27d60f779b40fbb5c02b267462275281365e4 100644 (file)
@@ -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