mirror of
				https://github.com/yggdrasil-network/yggdrasil-go.git
				synced 2025-11-04 03:05:07 +03:00 
			
		
		
		
	avoid leaking sessions when no listener exists, or blocking if it's busy
This commit is contained in:
		
							parent
							
								
									c15976e4dc
								
							
						
					
					
						commit
						b2cb1d965c
					
				
					 1 changed files with 25 additions and 25 deletions
				
			
		| 
						 | 
				
			
			@ -348,31 +348,30 @@ func (ss *sessions) sendPingPong(sinfo *sessionInfo, isPong bool) {
 | 
			
		|||
func (ss *sessions) handlePing(ping *sessionPing) {
 | 
			
		||||
	// Get the corresponding session (or create a new session)
 | 
			
		||||
	sinfo, isIn := ss.getByTheirPerm(&ping.SendPermPub)
 | 
			
		||||
	// Check if the session is allowed
 | 
			
		||||
	// TODO: this check may need to be moved
 | 
			
		||||
	if !isIn && !ss.isSessionAllowed(&ping.SendPermPub, false) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	// Create the session if it doesn't already exist
 | 
			
		||||
	if !isIn {
 | 
			
		||||
		ss.createSession(&ping.SendPermPub)
 | 
			
		||||
		sinfo, isIn = ss.getByTheirPerm(&ping.SendPermPub)
 | 
			
		||||
		if !isIn {
 | 
			
		||||
	switch {
 | 
			
		||||
	case isIn: // Session already exists
 | 
			
		||||
	case !ss.isSessionAllowed(&ping.SendPermPub, false): // Session is not allowed
 | 
			
		||||
	case ping.IsPong: // This is a response, not an initial ping, so ignore it.
 | 
			
		||||
	default:
 | 
			
		||||
		ss.listenerMutex.Lock()
 | 
			
		||||
		if ss.listener != nil {
 | 
			
		||||
			// This is a ping from an allowed node for which no session exists, and we have a listener ready to handle sessions.
 | 
			
		||||
			// We need to create a session and pass it to the listener.
 | 
			
		||||
			sinfo = ss.createSession(&ping.SendPermPub)
 | 
			
		||||
			if s, _ := ss.getByTheirPerm(&ping.SendPermPub); s != sinfo {
 | 
			
		||||
				panic("This should not happen")
 | 
			
		||||
			}
 | 
			
		||||
		ss.listenerMutex.Lock()
 | 
			
		||||
		// Check and see if there's a Listener waiting to accept connections
 | 
			
		||||
		// TODO: this should not block if nothing is accepting
 | 
			
		||||
		if !ping.IsPong && ss.listener != nil {
 | 
			
		||||
			conn := newConn(ss.core, crypto.GetNodeID(&sinfo.theirPermPub), &crypto.NodeID{}, sinfo)
 | 
			
		||||
			for i := range conn.nodeMask {
 | 
			
		||||
				conn.nodeMask[i] = 0xFF
 | 
			
		||||
			}
 | 
			
		||||
			conn.session.startWorkers()
 | 
			
		||||
			ss.listener.conn <- conn
 | 
			
		||||
			c := ss.listener.conn
 | 
			
		||||
			go func() { c <- conn }()
 | 
			
		||||
		}
 | 
			
		||||
		ss.listenerMutex.Unlock()
 | 
			
		||||
	}
 | 
			
		||||
	if sinfo != nil {
 | 
			
		||||
		sinfo.doFunc(func() {
 | 
			
		||||
			// Update the session
 | 
			
		||||
			if !sinfo.update(ping) { /*panic("Should not happen in testing")*/
 | 
			
		||||
| 
						 | 
				
			
			@ -383,6 +382,7 @@ func (ss *sessions) handlePing(ping *sessionPing) {
 | 
			
		|||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Get the MTU of the session.
 | 
			
		||||
// Will be equal to the smaller of this node's MTU or the remote node's MTU.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue