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:
parent
71aefa374d
commit
0687dc06c8
|
@ -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()
|
||||||
|
|
Loading…
Reference in a new issue