Close hack listener before closing channel
This commit is contained in:
		
							parent
							
								
									e28d70f5b2
								
							
						
					
					
						commit
						6307bfcdf4
					
				
					 1 changed files with 14 additions and 10 deletions
				
			
		
							
								
								
									
										24
									
								
								tun_linux.go
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								tun_linux.go
									
									
									
									
									
								
							|  | @ -22,6 +22,7 @@ import ( | ||||||
| 	"net" | 	"net" | ||||||
| 	"os" | 	"os" | ||||||
| 	"strconv" | 	"strconv" | ||||||
|  | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
| 	"unsafe" | 	"unsafe" | ||||||
| ) | ) | ||||||
|  | @ -32,16 +33,16 @@ const ( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type NativeTun struct { | type NativeTun struct { | ||||||
| 	fd            *os.File | 	fd                      *os.File | ||||||
| 	fdCancel      *rwcancel.RWCancel | 	fdCancel                *rwcancel.RWCancel | ||||||
| 	index         int32         // if index
 | 	index                   int32         // if index
 | ||||||
| 	name          string        // name of interface
 | 	name                    string        // name of interface
 | ||||||
| 	errors        chan error    // async error handling
 | 	errors                  chan error    // async error handling
 | ||||||
| 	events        chan TUNEvent // device related events
 | 	events                  chan TUNEvent // device related events
 | ||||||
| 	nopi          bool          // the device was pased IFF_NO_PI
 | 	nopi                    bool          // the device was pased IFF_NO_PI
 | ||||||
| 	netlinkSock   int | 	netlinkSock             int | ||||||
| 	netlinkCancel *rwcancel.RWCancel | 	netlinkCancel           *rwcancel.RWCancel | ||||||
| 
 | 	hackListenerClosed      sync.Mutex | ||||||
| 	statusListenersShutdown chan struct{} | 	statusListenersShutdown chan struct{} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -50,6 +51,7 @@ func (tun *NativeTun) File() *os.File { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (tun *NativeTun) RoutineHackListener() { | func (tun *NativeTun) RoutineHackListener() { | ||||||
|  | 	defer tun.hackListenerClosed.Unlock() | ||||||
| 	/* This is needed for the detection to work across network namespaces | 	/* This is needed for the detection to work across network namespaces | ||||||
| 	 * If you are reading this and know a better method, please get in touch. | 	 * If you are reading this and know a better method, please get in touch. | ||||||
| 	 */ | 	 */ | ||||||
|  | @ -91,6 +93,7 @@ func createNetlinkSocket() (int, error) { | ||||||
| func (tun *NativeTun) RoutineNetlinkListener() { | func (tun *NativeTun) RoutineNetlinkListener() { | ||||||
| 	defer func() { | 	defer func() { | ||||||
| 		unix.Close(tun.netlinkSock) | 		unix.Close(tun.netlinkSock) | ||||||
|  | 		tun.hackListenerClosed.Lock() | ||||||
| 		close(tun.events) | 		close(tun.events) | ||||||
| 	}() | 	}() | ||||||
| 
 | 
 | ||||||
|  | @ -455,6 +458,7 @@ func CreateTUNFromFile(fd *os.File) (TUNDevice, error) { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	tun.hackListenerClosed.Lock() | ||||||
| 	go tun.RoutineNetlinkListener() | 	go tun.RoutineNetlinkListener() | ||||||
| 	go tun.RoutineHackListener() // cross namespace
 | 	go tun.RoutineHackListener() // cross namespace
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue