From 24850a4d512e6b7a28f24ccf849f3f2efd8716d6 Mon Sep 17 00:00:00 2001 From: Etienne Perot Date: Thu, 12 Oct 2023 12:40:09 -0700 Subject: [PATCH] `secbench`: Read stdout before waiting for process. Go's `command.Cmd.Wait` closes stdout, so this can race with the stdout reader goroutine. PiperOrigin-RevId: 572983626 --- test/secbench/secbench.go | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/test/secbench/secbench.go b/test/secbench/secbench.go index 7e56e72bd..a41230d77 100644 --- a/test/secbench/secbench.go +++ b/test/secbench/secbench.go @@ -21,7 +21,6 @@ import ( "io" "os" "os/exec" - "sync" "testing" "time" @@ -85,14 +84,6 @@ func runRequest(runReq secbenchdef.BenchRunRequest) (secbenchdef.BenchRunRespons return secbenchdef.BenchRunResponse{}, fmt.Errorf("cannot attach pipe to stdout: %v", err) } defer stdout.Close() - var stdoutData []byte - var stdoutErr error - var stdoutWait sync.WaitGroup - stdoutWait.Add(1) - go func() { - defer stdoutWait.Done() - stdoutData, stdoutErr = io.ReadAll(stdout) - }() if err := cmd.Start(); err != nil { return secbenchdef.BenchRunResponse{}, fmt.Errorf("cannot start runner: %v", err) } @@ -102,13 +93,13 @@ func runRequest(runReq secbenchdef.BenchRunRequest) (secbenchdef.BenchRunRespons if err := stdin.Close(); err != nil { return secbenchdef.BenchRunResponse{}, fmt.Errorf("cannot close runner stdin pipe: %v", err) } + stdoutData, err := io.ReadAll(stdout) + if err != nil { + return secbenchdef.BenchRunResponse{}, fmt.Errorf("failed to read from runner stdout: %v", err) + } if err := cmd.Wait(); err != nil { return secbenchdef.BenchRunResponse{}, fmt.Errorf("runner failed: %v", err) } - stdoutWait.Wait() - if stdoutErr != nil { - return secbenchdef.BenchRunResponse{}, fmt.Errorf("failed to read from runner stdout: %v", stdoutErr) - } var runResp secbenchdef.BenchRunResponse if err := json.Unmarshal(stdoutData, &runResp); err != nil { return secbenchdef.BenchRunResponse{}, fmt.Errorf("cannot unmarshal response: %v", err)