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
This commit is contained in:
Etienne Perot
2023-10-12 12:42:43 -07:00
committed by gVisor bot
parent 3cbedad3da
commit 24850a4d51
+4 -13
View File
@@ -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)