]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
tun: freebsd: become controlling process when reopening tun FD
authorJason A. Donenfeld <Jason@zx2c4.com>
Mon, 19 Apr 2021 21:01:36 +0000 (15:01 -0600)
committerJason A. Donenfeld <Jason@zx2c4.com>
Mon, 19 Apr 2021 21:02:44 +0000 (15:02 -0600)
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 <Jason@zx2c4.com>
tun/tun_freebsd.go

index 53d4f4183db8bf0105f98b4fe16a7e1bafc3b1f2..37f1a0c41ad29660de861e6e9069f706fc642da8 100644 (file)
@@ -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()