Browse code

Merge pull request #10819 from jsdir/10815-relative-path-fix

Fixed relative filepath check

Alexander Morozov authored on 2015/02/20 05:54:44
Showing 4 changed files
... ...
@@ -4879,3 +4879,20 @@ func TestBuildEmptyScratch(t *testing.T) {
4879 4879
 	}
4880 4880
 	logDone("build - empty scratch Dockerfile")
4881 4881
 }
4882
+
4883
+func TestBuildDotDotFile(t *testing.T) {
4884
+	defer deleteImages("sc")
4885
+	ctx, err := fakeContext("FROM busybox\n",
4886
+		map[string]string{
4887
+			"..gitme": "",
4888
+		})
4889
+	if err != nil {
4890
+		t.Fatal(err)
4891
+	}
4892
+	defer ctx.Close()
4893
+
4894
+	if _, err = buildImageFromContext("sc", ctx, false); err != nil {
4895
+		t.Fatalf("Build was supposed to work: %s", err)
4896
+	}
4897
+	logDone("build - ..file")
4898
+}
... ...
@@ -525,7 +525,7 @@ loop:
525 525
 		if err != nil {
526 526
 			return err
527 527
 		}
528
-		if strings.HasPrefix(rel, "..") {
528
+		if strings.HasPrefix(rel, "../") {
529 529
 			return breakoutError(fmt.Errorf("%q is outside of %q", hdr.Name, dest))
530 530
 		}
531 531
 
... ...
@@ -81,7 +81,7 @@ func UnpackLayer(dest string, layer ArchiveReader) (size int64, err error) {
81 81
 		if err != nil {
82 82
 			return 0, err
83 83
 		}
84
-		if strings.HasPrefix(rel, "..") {
84
+		if strings.HasPrefix(rel, "../") {
85 85
 			return 0, breakoutError(fmt.Errorf("%q is outside of %q", hdr.Name, dest))
86 86
 		}
87 87
 		base := filepath.Base(path)
... ...
@@ -99,3 +99,29 @@ func TestChrootApplyEmptyArchiveFromSlowReader(t *testing.T) {
99 99
 		t.Fatal(err)
100 100
 	}
101 101
 }
102
+
103
+func TestChrootApplyDotDotFile(t *testing.T) {
104
+	tmpdir, err := ioutil.TempDir("", "docker-TestChrootApplyDotDotFile")
105
+	if err != nil {
106
+		t.Fatal(err)
107
+	}
108
+	defer os.RemoveAll(tmpdir)
109
+	src := filepath.Join(tmpdir, "src")
110
+	if err := os.MkdirAll(src, 0700); err != nil {
111
+		t.Fatal(err)
112
+	}
113
+	if err := ioutil.WriteFile(filepath.Join(src, "..gitme"), []byte(""), 0644); err != nil {
114
+		t.Fatal(err)
115
+	}
116
+	stream, err := archive.Tar(src, archive.Uncompressed)
117
+	if err != nil {
118
+		t.Fatal(err)
119
+	}
120
+	dest := filepath.Join(tmpdir, "dest")
121
+	if err := os.MkdirAll(dest, 0700); err != nil {
122
+		t.Fatal(err)
123
+	}
124
+	if _, err := ApplyLayer(dest, stream); err != nil {
125
+		t.Fatal(err)
126
+	}
127
+}