From c951c41a9b48169b4b3879bd550970832d4332c0 Mon Sep 17 00:00:00 2001 From: bagas Date: Mon, 8 Dec 2025 22:46:10 +0700 Subject: [PATCH] fix: prevent race condition when channel is used before being set --- session/session.go | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/session/session.go b/session/session.go index 6c70ec5..f5f9ed5 100644 --- a/session/session.go +++ b/session/session.go @@ -71,28 +71,25 @@ func New(conn *ssh.ServerConn, forwardingReq <-chan *ssh.Request, sshChan <-chan SlugManager: slugManager, } - go func() { - go session.Lifecycle.WaitForRunningStatus() - - for channel := range sshChan { - ch, reqs, err := channel.Accept() - if err != nil { - log.Printf("failed to accept channel: %v", err) - continue - } - session.channelOnce.Do(func() { - session.Lifecycle.SetChannel(ch) - session.Interaction.SetChannel(ch) - session.Lifecycle.SetStatus(types.SETUP) - go session.HandleGlobalRequest(forwardingReq) - }) - - go session.HandleGlobalRequest(reqs) + for channel := range sshChan { + ch, reqs, err := channel.Accept() + if err != nil { + log.Printf("failed to accept channel: %v", err) + continue } - if err := session.Lifecycle.Close(); err != nil { - log.Printf("failed to close session: %v", err) - } - }() + session.channelOnce.Do(func() { + session.Lifecycle.SetChannel(ch) + session.Interaction.SetChannel(ch) + session.Lifecycle.SetStatus(types.SETUP) + go session.HandleGlobalRequest(forwardingReq) + session.Lifecycle.WaitForRunningStatus() + }) + + go session.HandleGlobalRequest(reqs) + } + if err := session.Lifecycle.Close(); err != nil { + log.Printf("failed to close session: %v", err) + } } func updateClientSlug(oldSlug, newSlug string) bool {