diff options
author | Máximo Cuadros <mcuadros@gmail.com> | 2017-07-07 16:39:06 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-07 16:39:06 -0700 |
commit | 6b69a1630b30c41f4563fd95aca1d647ba611adf (patch) | |
tree | 342bfb394fdd7b22a4bc7e3deaf2f32c73585f30 /plumbing/transport/file | |
parent | 83c0e738df4b676e6c4aeed5fd1bc7c90fb341c5 (diff) | |
parent | 6506d377f7dc70b72d7454f5901d8199023dd8ed (diff) | |
download | go-git-6b69a1630b30c41f4563fd95aca1d647ba611adf.tar.gz |
Merge pull request #464 from smola/race-463
transport/file: avoid race with Command.Wait, fixes #463
Diffstat (limited to 'plumbing/transport/file')
-rw-r--r-- | plumbing/transport/file/client.go | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/plumbing/transport/file/client.go b/plumbing/transport/file/client.go index a199b01..b6d60c1 100644 --- a/plumbing/transport/file/client.go +++ b/plumbing/transport/file/client.go @@ -46,8 +46,9 @@ func (r *runner) Command(cmd string, ep transport.Endpoint, auth transport.AuthM } type command struct { - cmd *exec.Cmd - closed bool + cmd *exec.Cmd + stderrCloser io.Closer + closed bool } func (c *command) Start() error { @@ -55,7 +56,12 @@ func (c *command) Start() error { } func (c *command) StderrPipe() (io.Reader, error) { - return c.cmd.StderrPipe() + // Pipe returned by Command.StderrPipe has a race with Read + Command.Wait. + // We use an io.Pipe and close it after the command finishes. + r, w := io.Pipe() + c.cmd.Stderr = w + c.stderrCloser = r + return r, nil } func (c *command) StdinPipe() (io.WriteCloser, error) { @@ -72,7 +78,11 @@ func (c *command) Close() error { return nil } - defer func() { c.closed = true }() + defer func() { + c.closed = true + _ = c.stderrCloser.Close() + }() + err := c.cmd.Wait() if _, ok := err.(*os.PathError); ok { return nil |