@@ -18,21 +18,24 @@ type Decompressor interface {
18
18
Decompress (dst , src string , dir bool , umask os.FileMode ) error
19
19
}
20
20
21
- // Decompressors is the mapping of extension to the Decompressor implementation
22
- // that will decompress that extension/type.
23
- var Decompressors map [string ]Decompressor
24
-
25
- func init () {
26
- tarDecompressor := new (TarDecompressor )
27
- tbzDecompressor := new (TarBzip2Decompressor )
28
- tgzDecompressor := new (TarGzipDecompressor )
29
- txzDecompressor := new (TarXzDecompressor )
30
- tzstDecompressor := new (TarZstdDecompressor )
21
+ // LimitedDecompressors creates the set of Decompressors, but with each compressor configured
22
+ // with the given filesLimit and/or fileSizeLimit where applicable.
23
+ func LimitedDecompressors (filesLimit int , fileSizeLimit int64 ) map [string ]Decompressor {
24
+ tarDecompressor := & TarDecompressor {FilesLimit : filesLimit , FileSizeLimit : fileSizeLimit }
25
+ tbzDecompressor := & TarBzip2Decompressor {FilesLimit : filesLimit , FileSizeLimit : fileSizeLimit }
26
+ tgzDecompressor := & TarGzipDecompressor {FilesLimit : filesLimit , FileSizeLimit : fileSizeLimit }
27
+ txzDecompressor := & TarXzDecompressor {FilesLimit : filesLimit , FileSizeLimit : fileSizeLimit }
28
+ tzstDecompressor := & TarZstdDecompressor {FilesLimit : filesLimit , FileSizeLimit : fileSizeLimit }
29
+ bzipDecompressor := & Bzip2Decompressor {FileSizeLimit : fileSizeLimit }
30
+ gzipDecompressor := & GzipDecompressor {FileSizeLimit : fileSizeLimit }
31
+ xzDecompressor := & XzDecompressor {FileSizeLimit : fileSizeLimit }
32
+ zipDecompressor := & ZipDecompressor {FilesLimit : filesLimit , FileSizeLimit : fileSizeLimit }
33
+ zstDecompressor := & ZstdDecompressor {FileSizeLimit : fileSizeLimit }
31
34
32
- Decompressors = map [string ]Decompressor {
33
- "bz2" : new ( Bzip2Decompressor ) ,
34
- "gz" : new ( GzipDecompressor ) ,
35
- "xz" : new ( XzDecompressor ) ,
35
+ return map [string ]Decompressor {
36
+ "bz2" : bzipDecompressor ,
37
+ "gz" : gzipDecompressor ,
38
+ "xz" : xzDecompressor ,
36
39
"tar" : tarDecompressor ,
37
40
"tar.bz2" : tbzDecompressor ,
38
41
"tar.gz" : tgzDecompressor ,
@@ -42,11 +45,23 @@ func init() {
42
45
"tgz" : tgzDecompressor ,
43
46
"txz" : txzDecompressor ,
44
47
"tzst" : tzstDecompressor ,
45
- "zip" : new ( ZipDecompressor ) ,
46
- "zst" : new ( ZstdDecompressor ) ,
48
+ "zip" : zipDecompressor ,
49
+ "zst" : zstDecompressor ,
47
50
}
48
51
}
49
52
53
+ const (
54
+ noFilesLimit = 0
55
+ noFileSizeLimit = 0
56
+ )
57
+
58
+ // Decompressors is the mapping of extension to the Decompressor implementation
59
+ // configured with default settings that will decompress that extension/type.
60
+ //
61
+ // Note: these decompressors by default do not limit the number of files or the
62
+ // maximum file size created by the decompressed payload.
63
+ var Decompressors = LimitedDecompressors (noFilesLimit , noFileSizeLimit )
64
+
50
65
// containsDotDot checks if the filepath value v contains a ".." entry.
51
66
// This will check filepath components by splitting along / or \. This
52
67
// function is copied directly from the Go net/http implementation.
0 commit comments