From b544559bb6d1b5c62fba4af5e843ff542174f079 Mon Sep 17 00:00:00 2001 From: Fazlul Shahriar Date: Thu, 28 Nov 2019 01:18:39 -0500 Subject: [PATCH] ssh/agent: fix TestServerResponseTooLarge on Plan 9 First, modify the test to report a better error by waiting for the Marshal+Write goroutine to finish before returning from the test. If we return too early, a failure inside that goroutine can generate a panic. Second, we workaround plan9 not returning the actual number of bytes written on the connection in case of a hangup (due to closed connection). I've verified that syscall.Pwrite returns -1 on hangup in this particular case even when some data did get written. Fixes golang/go#35888 Change-Id: I7998cff926295f0d577b125c137021a9adc1be5a Reviewed-on: https://go-review.googlesource.com/c/crypto/+/209298 Reviewed-by: Han-Wen Nienhuys Run-TryBot: Han-Wen Nienhuys TryBot-Result: Gobot Gobot --- ssh/agent/client_test.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/ssh/agent/client_test.go b/ssh/agent/client_test.go index 71e9db1..de1c783 100644 --- a/ssh/agent/client_test.go +++ b/ssh/agent/client_test.go @@ -13,6 +13,7 @@ import ( "os" "os/exec" "path/filepath" + "runtime" "strconv" "strings" "sync" @@ -317,6 +318,8 @@ func TestServerResponseTooLarge(t *testing.T) { if err != nil { t.Fatalf("netPipe: %v", err) } + done := make(chan struct{}) + defer func() { <-done }() defer a.Close() defer b.Close() @@ -327,9 +330,21 @@ func TestServerResponseTooLarge(t *testing.T) { agent := NewClient(a) go func() { - n, _ := b.Write(ssh.Marshal(response)) + defer close(done) + n, err := b.Write(ssh.Marshal(response)) if n < 4 { - t.Fatalf("At least 4 bytes (the response size) should have been successfully written: %d < 4", n) + if runtime.GOOS == "plan9" { + if e1, ok := err.(*net.OpError); ok { + if e2, ok := e1.Err.(*os.PathError); ok { + switch e2.Err.Error() { + case "Hangup", "i/o on hungup channel": + // syscall.Pwrite returns -1 in this case even when some data did get written. + return + } + } + } + } + t.Errorf("At least 4 bytes (the response size) should have been successfully written: %d < 4: %v", n, err) } }() _, err = agent.List()