From e27b2bcf23bd6e84ab84a688c08e317ad75052fa Mon Sep 17 00:00:00 2001 From: Mark Peek Date: Wed, 14 Oct 2015 08:25:39 -0700 Subject: [PATCH] communicator/winrm: fix race in runCommand --- communicator/winrm/communicator.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/communicator/winrm/communicator.go b/communicator/winrm/communicator.go index 59034fcf0..8530ad82b 100644 --- a/communicator/winrm/communicator.go +++ b/communicator/winrm/communicator.go @@ -5,6 +5,7 @@ import ( "io" "log" "os" + "sync" "github.com/masterzen/winrm/winrm" "github.com/mitchellh/packer/packer" @@ -84,20 +85,28 @@ func (c *Communicator) Start(rc *packer.RemoteCmd) error { func runCommand(shell *winrm.Shell, cmd *winrm.Command, rc *packer.RemoteCmd) { defer shell.Close() + var wg sync.WaitGroup + + copyFunc := func(w io.Writer, r io.Reader) { + wg.Add(1) + defer wg.Done() + io.Copy(w, r) + } if rc.Stdout != nil && cmd.Stdout != nil { - go io.Copy(rc.Stdout, cmd.Stdout) + go copyFunc(rc.Stdout, cmd.Stdout) } else { log.Printf("[WARN] Failed to read stdout for command '%s'", rc.Command) } if rc.Stderr != nil && cmd.Stderr != nil { - go io.Copy(rc.Stderr, cmd.Stderr) + go copyFunc(rc.Stderr, cmd.Stderr) } else { log.Printf("[WARN] Failed to read stderr for command '%s'", rc.Command) } cmd.Wait() + wg.Wait() code := cmd.ExitCode() log.Printf("[INFO] command '%s' exited with code: %d", rc.Command, code)