aboutsummaryrefslogtreecommitdiff
path: root/ssh/example_test.go
diff options
context:
space:
mode:
authorBryan C. Mills <bcmills@google.com>2023-11-09 09:23:46 -0500
committerGopher Robot <gobot@golang.org>2023-11-09 17:49:15 +0000
commitff15cd57d18f87d81a83bf288597042b2e50aaef (patch)
tree7f3685e168524f13c9d93df7702532415931446e /ssh/example_test.go
parenteb61739cd99fb244c7cd188d3c5bae54824e781d (diff)
downloadgo-x-crypto-ff15cd57d18f87d81a83bf288597042b2e50aaef.tar.xz
ssh: eliminate some goroutine leaks in tests and examples
This should fix the "Log in goroutine" panic seen in https://build.golang.org/log/e42bf69fc002113dbccfe602a6c67fd52e8f31df, as well as a few other related leaks. It also helps to verify that none of the functions under test deadlock unexpectedly. See https://go.dev/wiki/CodeReviewComments#goroutine-lifetimes. Updates golang/go#58901. Change-Id: Ica943444db381ae1accb80b101ea646e28ebf4f9 Reviewed-on: https://go-review.googlesource.com/c/crypto/+/541095 Auto-Submit: Bryan Mills <bcmills@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Nicola Murino <nicola.murino@gmail.com> Reviewed-by: Heschi Kreinick <heschi@google.com>
Diffstat (limited to 'ssh/example_test.go')
-rw-r--r--ssh/example_test.go18
1 files changed, 16 insertions, 2 deletions
diff --git a/ssh/example_test.go b/ssh/example_test.go
index 0a6b076..3920832 100644
--- a/ssh/example_test.go
+++ b/ssh/example_test.go
@@ -16,6 +16,7 @@ import (
"os"
"path/filepath"
"strings"
+ "sync"
"golang.org/x/crypto/ssh"
"golang.org/x/crypto/ssh/terminal"
@@ -98,8 +99,15 @@ func ExampleNewServerConn() {
}
log.Printf("logged in with key %s", conn.Permissions.Extensions["pubkey-fp"])
+ var wg sync.WaitGroup
+ defer wg.Wait()
+
// The incoming Request channel must be serviced.
- go ssh.DiscardRequests(reqs)
+ wg.Add(1)
+ go func() {
+ ssh.DiscardRequests(reqs)
+ wg.Done()
+ }()
// Service the incoming Channel channel.
for newChannel := range chans {
@@ -119,16 +127,22 @@ func ExampleNewServerConn() {
// Sessions have out-of-band requests such as "shell",
// "pty-req" and "env". Here we handle only the
// "shell" request.
+ wg.Add(1)
go func(in <-chan *ssh.Request) {
for req := range in {
req.Reply(req.Type == "shell", nil)
}
+ wg.Done()
}(requests)
term := terminal.NewTerminal(channel, "> ")
+ wg.Add(1)
go func() {
- defer channel.Close()
+ defer func() {
+ channel.Close()
+ wg.Done()
+ }()
for {
line, err := term.ReadLine()
if err != nil {