aboutsummaryrefslogtreecommitdiffstats
path: root/tun/tun_freebsd.go
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@tailscale.com>2021-02-18 14:53:22 -0800
committerJason A. Donenfeld <Jason@zx2c4.com>2021-02-22 15:26:29 +0100
commit0f4809f366daa77c6e2f5b09d3f05771fe9bf188 (patch)
tree51fcba51b8d65b559e4ac2da16bd045ec8b6d730 /tun/tun_freebsd.go
parentREADME: bump document Go requirement to 1.16 (diff)
downloadwireguard-go-0f4809f366daa77c6e2f5b09d3f05771fe9bf188.tar.xz
wireguard-go-0f4809f366daa77c6e2f5b09d3f05771fe9bf188.zip
tun: make NativeTun.Close well behaved, not crash on double close
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
Diffstat (limited to 'tun/tun_freebsd.go')
-rw-r--r--tun/tun_freebsd.go24
1 files changed, 14 insertions, 10 deletions
diff --git a/tun/tun_freebsd.go b/tun/tun_freebsd.go
index e0dc2e1..12b44da 100644
--- a/tun/tun_freebsd.go
+++ b/tun/tun_freebsd.go
@@ -11,6 +11,7 @@ import (
"fmt"
"net"
"os"
+ "sync"
"syscall"
"unsafe"
@@ -82,6 +83,7 @@ type NativeTun struct {
events chan Event
errors chan error
routeSocket int
+ closeOnce sync.Once
}
func (tun *NativeTun) routineRouteListener(tunIfindex int) {
@@ -472,16 +474,18 @@ func (tun *NativeTun) Flush() error {
}
func (tun *NativeTun) Close() error {
- var err3 error
- err1 := tun.tunFile.Close()
- err2 := tunDestroy(tun.name)
- if tun.routeSocket != -1 {
- unix.Shutdown(tun.routeSocket, unix.SHUT_RDWR)
- err3 = unix.Close(tun.routeSocket)
- tun.routeSocket = -1
- } else if tun.events != nil {
- close(tun.events)
- }
+ var err1, err2, err3 error
+ tun.closeOnce.Do(func() {
+ err1 = tun.tunFile.Close()
+ err2 = tunDestroy(tun.name)
+ if tun.routeSocket != -1 {
+ unix.Shutdown(tun.routeSocket, unix.SHUT_RDWR)
+ err3 = unix.Close(tun.routeSocket)
+ tun.routeSocket = -1
+ } else if tun.events != nil {
+ close(tun.events)
+ }
+ })
if err1 != nil {
return err1
}