diff options
author | Russ Cox <rsc@golang.org> | 2016-10-17 17:20:48 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2016-10-18 12:48:03 +0000 |
commit | 736443c13a718f0a9c30327ebbf09f58ccbe6d49 (patch) | |
tree | b2db1437924ec42c30a14122087ffbb353f503b7 /src/os/exec/exec_test.go | |
parent | 5fbf35dc3fadd29785739fcec061d42157ea7861 (diff) | |
download | go-736443c13a718f0a9c30327ebbf09f58ccbe6d49.tar.gz go-736443c13a718f0a9c30327ebbf09f58ccbe6d49.zip |
os/exec: allow simultaneous cmd.Wait and Write of cmd.StdinPipe
cmd.StdinPipe returns an io.WriteCloser.
It's reasonable to expect the caller not to call Write and Close simultaneously,
but there is an implicit Close in cmd.Wait that's not obvious.
We already synchronize the implicit Close in cmd.Wait against
any explicit Close from the caller. Also synchronize that implicit
Close against any explicit Write from the caller.
Fixes #9307.
Change-Id: I8561e9369d6e5ac88dfbca1175549f6dfa04b8ac
Reviewed-on: https://go-review.googlesource.com/31148
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/os/exec/exec_test.go')
-rw-r--r-- | src/os/exec/exec_test.go | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/os/exec/exec_test.go b/src/os/exec/exec_test.go index 8d44401d0e..b14343752a 100644 --- a/src/os/exec/exec_test.go +++ b/src/os/exec/exec_test.go @@ -101,6 +101,26 @@ func TestCatStdin(t *testing.T) { } } +func TestEchoFileRace(t *testing.T) { + cmd := helperCommand(t, "echo") + stdin, err := cmd.StdinPipe() + if err != nil { + t.Fatalf("StdinPipe: %v", err) + } + if err := cmd.Start(); err != nil { + t.Fatalf("Start: %v", err) + } + wrote := make(chan bool) + go func() { + defer close(wrote) + fmt.Fprint(stdin, "echo\n") + }() + if err := cmd.Wait(); err != nil { + t.Fatalf("Wait: %v", err) + } + <-wrote +} + func TestCatGoodAndBadFile(t *testing.T) { // Testing combined output and error values. bs, err := helperCommand(t, "cat", "/bogus/file.foo", "exec_test.go").CombinedOutput() |