ssh/tailssh: use WaitGroup.Go for I/O copy goroutines

Replace wg.Add(1) + go func() { defer wg.Done(); ... }() with
wg.Go(func() { ... }), matching the existing pattern used in the
test code. Available since Go 1.24.

Suggested-by: Ox Cart <ox@tailscale.com> (PR #18331 review)

Updates #18256

Change-Id: Ia6d6fb22887fd9a662c01dd4f5cea521b87b063c
Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
This commit is contained in:
Kristoffer Dalby 2026-04-08 12:00:16 +00:00
parent d8abcce89b
commit 5e2e75a007

View File

@ -1081,19 +1081,15 @@ func (ss *sshSession) run() {
// Start goroutines to copy stdin/stdout/stderr.
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
wg.Go(func() {
defer ss.wrStdin.Close()
if _, err := io.Copy(rec.writer("i", ss.wrStdin), ss); err != nil {
logf("stdin copy: %v", err)
ss.cancelCtx(err)
}
}()
})
wg.Add(1)
go func() {
defer wg.Done()
wg.Go(func() {
defer ss.rdStdout.Close()
if _, err := io.Copy(rec.writer("o", ss), ss.rdStdout); err != nil && !errors.Is(err, io.EOF) {
logf("stdout copy: %v", err)
@ -1103,18 +1099,16 @@ func (ss *sshSession) run() {
// more data will be sent. The channel remains open for exit-status.
// https://datatracker.ietf.org/doc/html/rfc4254#section-5.3
ss.CloseWrite()
}()
})
// rdStderr is nil for ptys.
if ss.rdStderr != nil {
wg.Add(1)
go func() {
defer wg.Done()
wg.Go(func() {
defer ss.rdStderr.Close()
if _, err := io.Copy(ss.Stderr(), ss.rdStderr); err != nil {
logf("stderr copy: %v", err)
}
}()
})
}
err = ss.cmd.Wait()