From a4b445d2e9d609c431e38297a60e8f338816e445 Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Mon, 8 Dec 2014 15:04:34 -0800 Subject: [PATCH] Flush stdin from within chroot archive This makes sure that we don't buffer in memory and that we also flush stdin from diff as well as untar. Signed-off-by: Michael Crosby Upstream-commit: d1535131d259bb8a980770d47c0865a1be4373e3 Component: engine --- components/engine/pkg/chrootarchive/archive.go | 5 +---- .../engine/pkg/chrootarchive/archive_test.go | 16 ++++++++++++++++ components/engine/pkg/chrootarchive/diff.go | 1 + components/engine/pkg/chrootarchive/init.go | 8 ++++++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/components/engine/pkg/chrootarchive/archive.go b/components/engine/pkg/chrootarchive/archive.go index 8d139fa857..2942d9d6c0 100644 --- a/components/engine/pkg/chrootarchive/archive.go +++ b/components/engine/pkg/chrootarchive/archive.go @@ -6,7 +6,6 @@ import ( "flag" "fmt" "io" - "io/ioutil" "os" "runtime" "strings" @@ -35,9 +34,7 @@ func untar() { fatal(err) } // fully consume stdin in case it is zero padded - if _, err := ioutil.ReadAll(os.Stdin); err != nil { - fatal(err) - } + flush(os.Stdin) os.Exit(0) } diff --git a/components/engine/pkg/chrootarchive/archive_test.go b/components/engine/pkg/chrootarchive/archive_test.go index 8477c0676f..0fe3d64f95 100644 --- a/components/engine/pkg/chrootarchive/archive_test.go +++ b/components/engine/pkg/chrootarchive/archive_test.go @@ -83,3 +83,19 @@ func TestChrootUntarEmptyArchiveFromSlowReader(t *testing.T) { t.Fatal(err) } } + +func TestChrootApplyEmptyArchiveFromSlowReader(t *testing.T) { + tmpdir, err := ioutil.TempDir("", "docker-TestChrootApplyEmptyArchiveFromSlowReader") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmpdir) + dest := filepath.Join(tmpdir, "dest") + if err := os.MkdirAll(dest, 0700); err != nil { + t.Fatal(err) + } + stream := &slowEmptyTarReader{size: 10240, chunkSize: 1024} + if err := ApplyLayer(dest, stream); err != nil { + t.Fatal(err) + } +} diff --git a/components/engine/pkg/chrootarchive/diff.go b/components/engine/pkg/chrootarchive/diff.go index 2653aefe9d..f9f9b9d5e0 100644 --- a/components/engine/pkg/chrootarchive/diff.go +++ b/components/engine/pkg/chrootarchive/diff.go @@ -32,6 +32,7 @@ func applyLayer() { fatal(err) } os.RemoveAll(tmpDir) + flush(os.Stdin) os.Exit(0) } diff --git a/components/engine/pkg/chrootarchive/init.go b/components/engine/pkg/chrootarchive/init.go index b548e9fe72..4116026eff 100644 --- a/components/engine/pkg/chrootarchive/init.go +++ b/components/engine/pkg/chrootarchive/init.go @@ -2,6 +2,8 @@ package chrootarchive import ( "fmt" + "io" + "io/ioutil" "os" "github.com/docker/docker/pkg/reexec" @@ -16,3 +18,9 @@ func fatal(err error) { fmt.Fprint(os.Stderr, err) os.Exit(1) } + +// flush consumes all the bytes from the reader discarding +// any errors +func flush(r io.Reader) { + io.Copy(ioutil.Discard, r) +}