@@ -51,6 +51,10 @@ func testTarArchive(t *testing.T, context spec.G, it spec.S) {
51
51
_ , err = tw .Write ([]byte {})
52
52
Expect (err ).NotTo (HaveOccurred ())
53
53
54
+ Expect (tw .WriteHeader (& tar.Header {Name : "hardlink" , Mode : 0755 , Size : int64 (0 ), Typeflag : tar .TypeLink , Linkname : "first" })).To (Succeed ())
55
+ _ , err = tw .Write ([]byte {})
56
+ Expect (err ).NotTo (HaveOccurred ())
57
+
54
58
nestedFile := filepath .Join ("some-dir" , "some-other-dir" , "some-file" )
55
59
Expect (tw .WriteHeader (& tar.Header {Name : nestedFile , Mode : 0755 , Size : int64 (len (nestedFile ))})).To (Succeed ())
56
60
_ , err = tw .Write ([]byte (nestedFile ))
@@ -80,10 +84,11 @@ func testTarArchive(t *testing.T, context spec.G, it spec.S) {
80
84
Expect (err ).NotTo (HaveOccurred ())
81
85
Expect (files ).To (ConsistOf ([]string {
82
86
filepath .Join (tempDir , "first" ),
87
+ filepath .Join (tempDir , "hardlink" ),
83
88
filepath .Join (tempDir , "second" ),
84
- filepath .Join (tempDir , "third" ),
85
89
filepath .Join (tempDir , "some-dir" ),
86
90
filepath .Join (tempDir , "symlink" ),
91
+ filepath .Join (tempDir , "third" ),
87
92
}))
88
93
89
94
info , err := os .Stat (filepath .Join (tempDir , "first" ))
@@ -96,6 +101,10 @@ func testTarArchive(t *testing.T, context spec.G, it spec.S) {
96
101
data , err := os .ReadFile (filepath .Join (tempDir , "symlink" ))
97
102
Expect (err ).NotTo (HaveOccurred ())
98
103
Expect (data ).To (Equal ([]byte (`first` )))
104
+
105
+ data , err = os .ReadFile (filepath .Join (tempDir , "hardlink" ))
106
+ Expect (err ).NotTo (HaveOccurred ())
107
+ Expect (data ).To (Equal ([]byte (`first` )))
99
108
})
100
109
101
110
it ("unpackages the archive into the path but also strips the first component" , func () {
@@ -235,26 +244,54 @@ func testTarArchive(t *testing.T, context spec.G, it spec.S) {
235
244
})
236
245
})
237
246
247
+ context ("when there is a symlink cycle" , func () {
248
+ var cyclicalSymlinkTar vacation.TarArchive
249
+
250
+ it .Before (func () {
251
+ var err error
252
+
253
+ buffer := bytes .NewBuffer (nil )
254
+ tw := tar .NewWriter (buffer )
255
+
256
+ Expect (tw .WriteHeader (& tar.Header {Name : "a-symlink" , Mode : 0755 , Size : int64 (0 ), Typeflag : tar .TypeSymlink , Linkname : "b-symlink" })).To (Succeed ())
257
+ _ , err = tw .Write ([]byte {})
258
+ Expect (err ).NotTo (HaveOccurred ())
259
+
260
+ Expect (tw .WriteHeader (& tar.Header {Name : "b-symlink" , Mode : 0755 , Size : int64 (0 ), Typeflag : tar .TypeSymlink , Linkname : "a-symlink" })).To (Succeed ())
261
+ _ , err = tw .Write ([]byte {})
262
+ Expect (err ).NotTo (HaveOccurred ())
263
+
264
+ Expect (tw .Close ()).To (Succeed ())
265
+
266
+ cyclicalSymlinkTar = vacation .NewTarArchive (bytes .NewReader (buffer .Bytes ()))
267
+ })
268
+
269
+ it ("returns an error" , func () {
270
+ err := cyclicalSymlinkTar .Decompress (tempDir )
271
+ Expect (err ).To (MatchError (ContainSubstring ("failed: max iterations reached: this link graph contains a cycle" )))
272
+ })
273
+ })
274
+
238
275
context ("when it tries to symlink to a file that does not exist" , func () {
239
- var zipSlipSymlinkTar vacation.TarArchive
276
+ var symlinkNotExistTar vacation.TarArchive
240
277
241
278
it .Before (func () {
242
279
var err error
243
280
244
281
buffer := bytes .NewBuffer (nil )
245
282
tw := tar .NewWriter (buffer )
246
283
247
- Expect (tw .WriteHeader (& tar.Header {Name : "symlink" , Mode : 0755 , Size : int64 (0 ), Typeflag : tar .TypeSymlink , Linkname : filepath . Join ( ".." , " some-file") })).To (Succeed ())
284
+ Expect (tw .WriteHeader (& tar.Header {Name : "symlink" , Mode : 0755 , Size : int64 (0 ), Typeflag : tar .TypeSymlink , Linkname : " some-file" })).To (Succeed ())
248
285
_ , err = tw .Write ([]byte {})
249
286
Expect (err ).NotTo (HaveOccurred ())
250
287
251
288
Expect (tw .Close ()).To (Succeed ())
252
289
253
- zipSlipSymlinkTar = vacation .NewTarArchive (bytes .NewReader (buffer .Bytes ()))
290
+ symlinkNotExistTar = vacation .NewTarArchive (bytes .NewReader (buffer .Bytes ()))
254
291
})
255
292
256
293
it ("returns an error" , func () {
257
- err := zipSlipSymlinkTar .Decompress (tempDir )
294
+ err := symlinkNotExistTar .Decompress (tempDir )
258
295
Expect (err ).To (MatchError (ContainSubstring ("failed to evaluate symlink" )))
259
296
Expect (err ).To (MatchError (ContainSubstring ("no such file or directory" )))
260
297
})
@@ -290,31 +327,56 @@ func testTarArchive(t *testing.T, context spec.G, it spec.S) {
290
327
})
291
328
})
292
329
293
- context ("when there is a symlink cycle" , func () {
294
- var cyclicalSymlinkTar vacation.TarArchive
330
+ context ("when there is a link cycle" , func () {
331
+ var cyclicalLinkTar vacation.TarArchive
295
332
296
333
it .Before (func () {
297
334
var err error
298
335
299
336
buffer := bytes .NewBuffer (nil )
300
337
tw := tar .NewWriter (buffer )
301
338
302
- Expect (tw .WriteHeader (& tar.Header {Name : "a-symlink " , Mode : 0755 , Size : int64 (0 ), Typeflag : tar .TypeSymlink , Linkname : "b-symlink " })).To (Succeed ())
339
+ Expect (tw .WriteHeader (& tar.Header {Name : "a-link " , Mode : 0755 , Size : int64 (0 ), Typeflag : tar .TypeLink , Linkname : "b-link " })).To (Succeed ())
303
340
_ , err = tw .Write ([]byte {})
304
341
Expect (err ).NotTo (HaveOccurred ())
305
342
306
- Expect (tw .WriteHeader (& tar.Header {Name : "b-symlink" , Mode : 0755 , Size : int64 (0 ), Typeflag : tar .TypeSymlink , Linkname : "a-symlink" })).To (Succeed ())
343
+ Expect (tw .WriteHeader (& tar.Header {Name : "b-link" , Mode : 0755 , Size : int64 (0 ), Typeflag : tar .TypeLink , Linkname : "a-link" })).To (Succeed ())
344
+ _ , err = tw .Write ([]byte {})
345
+ Expect (err ).NotTo (HaveOccurred ())
346
+
347
+ Expect (tw .Close ()).To (Succeed ())
348
+
349
+ cyclicalLinkTar = vacation .NewTarArchive (bytes .NewReader (buffer .Bytes ()))
350
+ })
351
+
352
+ it ("returns an error" , func () {
353
+ err := cyclicalLinkTar .Decompress (tempDir )
354
+ Expect (err ).To (MatchError (ContainSubstring ("failed: max iterations reached: this link graph contains a cycle" )))
355
+ })
356
+ })
357
+
358
+ context ("when it tries to symlink to a file that does not exist" , func () {
359
+ var linkNotExistTar vacation.TarArchive
360
+
361
+ it .Before (func () {
362
+ var err error
363
+
364
+ buffer := bytes .NewBuffer (nil )
365
+ tw := tar .NewWriter (buffer )
366
+
367
+ Expect (tw .WriteHeader (& tar.Header {Name : "link" , Mode : 0755 , Size : int64 (0 ), Typeflag : tar .TypeLink , Linkname : "some-file" })).To (Succeed ())
307
368
_ , err = tw .Write ([]byte {})
308
369
Expect (err ).NotTo (HaveOccurred ())
309
370
310
371
Expect (tw .Close ()).To (Succeed ())
311
372
312
- cyclicalSymlinkTar = vacation .NewTarArchive (bytes .NewReader (buffer .Bytes ()))
373
+ linkNotExistTar = vacation .NewTarArchive (bytes .NewReader (buffer .Bytes ()))
313
374
})
314
375
315
376
it ("returns an error" , func () {
316
- err := cyclicalSymlinkTar .Decompress (tempDir )
317
- Expect (err ).To (MatchError (ContainSubstring ("failed: max iterations reached: this symlink graph contains a cycle" )))
377
+ err := linkNotExistTar .Decompress (tempDir )
378
+ Expect (err ).To (MatchError (ContainSubstring ("failed to extract link" )))
379
+ Expect (err ).To (MatchError (ContainSubstring ("no such file or directory" )))
318
380
})
319
381
})
320
382
})
0 commit comments