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 | ||||
| 	_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() | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user