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 <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld 2021-04-19 15:01:36 -06:00
parent 71aefa374d
commit 0687dc06c8

View file

@ -21,6 +21,7 @@ const (
_TUNSIFHEAD = 0x80047460 _TUNSIFHEAD = 0x80047460
_TUNSIFMODE = 0x8004745e _TUNSIFMODE = 0x8004745e
_TUNGIFNAME = 0x4020745d _TUNGIFNAME = 0x4020745d
_TUNSIFPID = 0x2000745f
_SIOCGIFINFO_IN6 = 0xc048696c _SIOCGIFINFO_IN6 = 0xc048696c
_SIOCSIFINFO_IN6 = 0xc048696d _SIOCSIFINFO_IN6 = 0xc048696d
@ -266,6 +267,15 @@ func CreateTUNFromFile(file *os.File, mtu int) (Device, error) {
errors: make(chan error, 1), 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() name, err := tun.Name()
if err != nil { if err != nil {
tun.tunFile.Close() tun.tunFile.Close()