From 61f9d97bd35b0fb05ecf74b8ae968853078c839c Mon Sep 17 00:00:00 2001 From: joerger Date: Mon, 13 Jan 2025 11:59:50 -0800 Subject: [PATCH] Fix data race in x11 forwarding test. --- lib/srv/regular/sshserver_test.go | 36 ++++++++++++++++++------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/lib/srv/regular/sshserver_test.go b/lib/srv/regular/sshserver_test.go index 9cde84d661fad..8b46c851c1758 100644 --- a/lib/srv/regular/sshserver_test.go +++ b/lib/srv/regular/sshserver_test.go @@ -1197,24 +1197,30 @@ func x11EchoSession(ctx context.Context, t *testing.T, clt *tracessh.Client) x11 os.Remove(tmpFile.Name()) }) - // type 'printenv DISPLAY > /path/to/tmp/file' into the session (dumping the value of DISPLAY into the temp file) - _, err = keyboard.Write([]byte(fmt.Sprintf("printenv %v >> %s\n\r", x11.DisplayEnv, tmpFile.Name()))) - require.NoError(t, err) - - // wait for the output - var display string - require.Eventually(t, func() bool { - output, err := os.ReadFile(tmpFile.Name()) - if err == nil && len(output) != 0 { - display = strings.TrimSpace(string(output)) - return true - } - return false - }, 5*time.Second, 10*time.Millisecond, "failed to read display") + // Reading the display may fail if the session is not fully initialized + // and the write to stdin is swallowed. + display := make(chan string, 1) + require.EventuallyWithT(t, func(t *assert.CollectT) { + // enter 'printenv DISPLAY > /path/to/tmp/file' into the session (dumping the value of DISPLAY into the temp file) + _, err = keyboard.Write([]byte(fmt.Sprintf("printenv %v > %s\n\r", x11.DisplayEnv, tmpFile.Name()))) + assert.NoError(t, err) + + assert.Eventually(t, func() bool { + output, err := os.ReadFile(tmpFile.Name()) + if err == nil && len(output) != 0 { + select { + case display <- strings.TrimSpace(string(output)): + default: + } + return true + } + return false + }, time.Second, 100*time.Millisecond, "failed to read display") + }, 10*time.Second, 1*time.Second) // Make a new connection to the XServer proxy, the client // XServer should echo back anything written on it. - serverDisplay, err := x11.ParseDisplay(display) + serverDisplay, err := x11.ParseDisplay(<-display) require.NoError(t, err) return serverDisplay