@@ -18,21 +18,24 @@ type Decompressor interface {
1818Decompress (dst , src string , dir bool , umask os.FileMode ) error
1919}
2020
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 }
3134
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 ,
3639"tar" : tarDecompressor ,
3740"tar.bz2" : tbzDecompressor ,
3841"tar.gz" : tgzDecompressor ,
@@ -42,11 +45,23 @@ func init() {
4245"tgz" : tgzDecompressor ,
4346"txz" : txzDecompressor ,
4447"tzst" : tzstDecompressor ,
45- "zip" : new ( ZipDecompressor ) ,
46- "zst" : new ( ZstdDecompressor ) ,
48+ "zip" : zipDecompressor ,
49+ "zst" : zstDecompressor ,
4750}
4851}
4952
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+
5065// containsDotDot checks if the filepath value v contains a ".." entry.
5166// This will check filepath components by splitting along / or \. This
5267// function is copied directly from the Go net/http implementation.
0 commit comments