Jelajahi Sumber

Merge pull request #17088 from Microsoft/sjw/archive_hang_fix

Fixing hang in archive.CopyFileWithTar with invalid dst
Jess Frazelle 9 tahun lalu
induk
melakukan
98c01c2c90
2 mengubah file dengan 27 tambahan dan 1 penghapusan
  1. 5 1
      pkg/archive/archive.go
  2. 22 0
      pkg/archive/archive_windows_test.go

+ 5 - 1
pkg/archive/archive.go

@@ -914,7 +914,11 @@ func (archiver *Archiver) CopyFileWithTar(src, dst string) (err error) {
 		}
 	}()
 
-	return archiver.Untar(r, filepath.Dir(dst), nil)
+	err = archiver.Untar(r, filepath.Dir(dst), nil)
+	if err != nil {
+		r.CloseWithError(err)
+	}
+	return err
 }
 
 // CopyFileWithTar emulates the behavior of the 'cp' command-line

+ 22 - 0
pkg/archive/archive_windows_test.go

@@ -3,10 +3,32 @@
 package archive
 
 import (
+	"io/ioutil"
 	"os"
+	"path/filepath"
 	"testing"
 )
 
+func TestCopyFileWithInvalidDest(t *testing.T) {
+	folder, err := ioutil.TempDir("", "docker-archive-test")
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer os.RemoveAll(folder)
+	dest := "c:dest"
+	srcFolder := filepath.Join(folder, "src")
+	src := filepath.Join(folder, "src", "src")
+	err = os.MkdirAll(srcFolder, 0740)
+	if err != nil {
+		t.Fatal(err)
+	}
+	ioutil.WriteFile(src, []byte("content"), 0777)
+	err = CopyWithTar(src, dest)
+	if err == nil {
+		t.Fatalf("archiver.CopyWithTar should throw an error on invalid dest.")
+	}
+}
+
 func TestCanonicalTarNameForPath(t *testing.T) {
 	cases := []struct {
 		in, expected string