From d3790db03acbe33145929cac4efe9f19097c0794 Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Fri, 3 Nov 2017 22:19:10 -0400 Subject: [PATCH] The cp command must call Close() on files, and does not pass on Mac Path operations needed to be with filepath, not path (for cross platform compat), and TMPDIR is not guaranteed to have a trailing slash. --- pkg/kubectl/cmd/cp.go | 16 +++++++---- pkg/kubectl/cmd/cp_test.go | 54 +++++++++++++++++++------------------- 2 files changed, 38 insertions(+), 32 deletions(-) diff --git a/pkg/kubectl/cmd/cp.go b/pkg/kubectl/cmd/cp.go index 8b3a89096b6..a5d67de3f96 100644 --- a/pkg/kubectl/cmd/cp.go +++ b/pkg/kubectl/cmd/cp.go @@ -301,10 +301,12 @@ func recursiveTar(srcBase, srcFile, destBase, destFile string, tw *tar.Writer) e if err != nil { return err } - defer f.Close() - _, err = io.Copy(tw, f) - return err + + if _, err := io.Copy(tw, f); err != nil { + return err + } + return f.Close() } return nil } @@ -330,7 +332,6 @@ func untarAll(reader io.Reader, destFile, prefix string) error { return err } if header.FileInfo().IsDir() { - if err := os.MkdirAll(outFileName, 0755); err != nil { return err } @@ -359,7 +360,12 @@ func untarAll(reader io.Reader, destFile, prefix string) error { return err } defer outFile.Close() - io.Copy(outFile, tarReader) + if _, err := io.Copy(outFile, tarReader); err != nil { + return err + } + if err := outFile.Close(); err != nil { + return err + } } } diff --git a/pkg/kubectl/cmd/cp_test.go b/pkg/kubectl/cmd/cp_test.go index b410bc694ba..8236fef7a37 100644 --- a/pkg/kubectl/cmd/cp_test.go +++ b/pkg/kubectl/cmd/cp_test.go @@ -109,8 +109,8 @@ func TestGetPrefix(t *testing.T) { } func TestTarUntar(t *testing.T) { - dir, err := ioutil.TempDir(os.TempDir(), "input") - dir2, err2 := ioutil.TempDir(os.TempDir(), "output") + dir, err := ioutil.TempDir("", "input") + dir2, err2 := ioutil.TempDir("", "output") if err != nil || err2 != nil { t.Errorf("unexpected error: %v | %v", err, err2) t.FailNow() @@ -160,74 +160,74 @@ func TestTarUntar(t *testing.T) { for _, file := range files { filepath := path.Join(dir, file.name) if err := os.MkdirAll(path.Dir(filepath), 0755); err != nil { - t.Errorf("unexpected error: %v", err) - t.FailNow() + t.Fatalf("unexpected error: %v", err) } if file.fileType == RegularFile { f, err := os.Create(filepath) if err != nil { - t.Errorf("unexpected error: %v", err) - t.FailNow() + t.Fatalf("unexpected error: %v", err) } defer f.Close() if _, err := io.Copy(f, bytes.NewBuffer([]byte(file.data))); err != nil { - t.Errorf("unexpected error: %v", err) - t.FailNow() + t.Fatalf("unexpected error: %v", err) + } + if err := f.Close(); err != nil { + t.Fatal(err) } } else if file.fileType == SymLink { err := os.Symlink(file.data, filepath) if err != nil { - t.Errorf("unexpected error: %v", err) - t.FailNow() + t.Fatalf("unexpected error: %v", err) } } else { - t.Errorf("unexpected file type: %v", file) - t.FailNow() + t.Fatalf("unexpected file type: %v", file) } } writer := &bytes.Buffer{} if err := makeTar(dir, dir, writer); err != nil { - t.Errorf("unexpected error: %v", err) + t.Fatalf("unexpected error: %v", err) } reader := bytes.NewBuffer(writer.Bytes()) if err := untarAll(reader, dir2, ""); err != nil { - t.Errorf("unexpected error: %v", err) - t.FailNow() + t.Fatalf("unexpected error: %v", err) } for _, file := range files { - absPath := dir2 + strings.TrimPrefix(dir, os.TempDir()) - filepath := path.Join(absPath, file.name) + absPath := filepath.Join(dir2, strings.TrimPrefix(dir, os.TempDir())) + filePath := filepath.Join(absPath, file.name) if file.fileType == RegularFile { - f, err := os.Open(filepath) + f, err := os.Open(filePath) if err != nil { - t.Errorf("unexpected error: %v", err) + t.Fatalf("unexpected error: %v", err) } defer f.Close() buff := &bytes.Buffer{} - io.Copy(buff, f) - + if _, err := io.Copy(buff, f); err != nil { + t.Fatal(err) + } + if err := f.Close(); err != nil { + t.Fatal(err) + } if file.data != string(buff.Bytes()) { - t.Errorf("expected: %s, saw: %s", file.data, string(buff.Bytes())) + t.Fatalf("expected: %s, saw: %s", file.data, string(buff.Bytes())) } } else if file.fileType == SymLink { - dest, err := os.Readlink(filepath) + dest, err := os.Readlink(filePath) if err != nil { - t.Errorf("unexpected error: %v", err) + t.Fatalf("unexpected error: %v", err) } if file.data != dest { - t.Errorf("expected: %s, saw: %s", file.data, dest) + t.Fatalf("expected: %s, saw: %s", file.data, dest) } } else { - t.Errorf("unexpected file type: %v", file) - t.FailNow() + t.Fatalf("unexpected file type: %v", file) } } }