From 8d5ecb951458f9385b4acd563e400c67c3ce97bd Mon Sep 17 00:00:00 2001 From: Megan Marsh Date: Fri, 28 Jun 2019 16:23:28 -0700 Subject: [PATCH] fix bug where ReadAll on the stderr pipe was causing an infinite hang because there was no stderr to report --- builder/docker/communicator.go | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/builder/docker/communicator.go b/builder/docker/communicator.go index aec668c35..e3e673051 100644 --- a/builder/docker/communicator.go +++ b/builder/docker/communicator.go @@ -246,18 +246,16 @@ func (c *Communicator) Download(src string, dst io.Writer) error { // enables it to work with directories. We don't actually support // directories in Download() but we still need to handle the tar format. - stderrOut, err := ioutil.ReadAll(stderrP) - if err != nil { - return err - } - - if string(stderrOut) != "" { - return fmt.Errorf("Error downloading file: %s", string(stderrOut)) - } - archive := tar.NewReader(pipe) _, err = archive.Next() if err != nil { + // see if we can get a useful error message from stderr, since stdout + // is messed up. + if stderrOut, err := ioutil.ReadAll(stderrP); err == nil { + if string(stderrOut) != "" { + return fmt.Errorf("Error downloading file: %s", string(stderrOut)) + } + } return fmt.Errorf("Failed to read header from tar stream: %s", err) }