From: Jason A. Donenfeld Date: Mon, 19 Apr 2021 21:01:36 +0000 (-0600) Subject: tun: freebsd: become controlling process when reopening tun FD X-Git-Tag: 0.0.20210424~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0687dc06c873d4dac0b604d642d724c2f5abb6b6;p=thirdparty%2Fwireguard-go.git tun: freebsd: become controlling process when reopening tun FD When we pass the TUN FD to the child, we have to call TUNSIFPID; otherwise when we close the device, we get a splat in dmesg. Signed-off-by: Jason A. Donenfeld --- diff --git a/tun/tun_freebsd.go b/tun/tun_freebsd.go index 53d4f41..37f1a0c 100644 --- a/tun/tun_freebsd.go +++ b/tun/tun_freebsd.go @@ -21,6 +21,7 @@ const ( _TUNSIFHEAD = 0x80047460 _TUNSIFMODE = 0x8004745e _TUNGIFNAME = 0x4020745d + _TUNSIFPID = 0x2000745f _SIOCGIFINFO_IN6 = 0xc048696c _SIOCSIFINFO_IN6 = 0xc048696d @@ -266,6 +267,15 @@ func CreateTUNFromFile(file *os.File, mtu int) (Device, error) { errors: make(chan error, 1), } + var errno syscall.Errno + tun.operateOnFd(func(fd uintptr) { + _, _, errno = unix.Syscall(unix.SYS_IOCTL, fd, _TUNSIFPID, uintptr(0)) + }) + if errno != 0 { + tun.tunFile.Close() + return nil, fmt.Errorf("unable to become controlling TUN process: %w", errno) + } + name, err := tun.Name() if err != nil { tun.tunFile.Close()