Skip to content

Commit 0edab85

Browse files
authored
Merge pull request #413 from hashicorp/limited-decompressors-helper
v1: decompressors: add LimitedDecompressors helper
2 parents 78e6721 + b38771f commit 0edab85

File tree

2 files changed

+81
-16
lines changed

2 files changed

+81
-16
lines changed

decompress.go

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,24 @@ type Decompressor interface {
1818
Decompress(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.

decompress_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package getter
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestLimitedDecompressors(t *testing.T) {
8+
const (
9+
maxFiles = 111
10+
maxSize = 222
11+
)
12+
13+
checkFileSizeLimit := func(limit int64) {
14+
if limit != maxSize {
15+
t.Fatalf("expected FileSizeLimit of %d, got %d", maxSize, limit)
16+
}
17+
}
18+
19+
checkFilesLimit := func(limit int) {
20+
if limit != maxFiles {
21+
t.Fatalf("expected FilesLimit of %d, got %d", maxFiles, limit)
22+
}
23+
}
24+
25+
decompressors := LimitedDecompressors(maxFiles, maxSize)
26+
27+
checkFilesLimit(decompressors["tar"].(*TarDecompressor).FilesLimit)
28+
checkFileSizeLimit(decompressors["tar"].(*TarDecompressor).FileSizeLimit)
29+
30+
checkFilesLimit(decompressors["tar.bz2"].(*TarBzip2Decompressor).FilesLimit)
31+
checkFileSizeLimit(decompressors["tar.bz2"].(*TarBzip2Decompressor).FileSizeLimit)
32+
33+
checkFilesLimit(decompressors["tar.gz"].(*TarGzipDecompressor).FilesLimit)
34+
checkFileSizeLimit(decompressors["tar.gz"].(*TarGzipDecompressor).FileSizeLimit)
35+
36+
checkFilesLimit(decompressors["tar.xz"].(*TarXzDecompressor).FilesLimit)
37+
checkFileSizeLimit(decompressors["tar.xz"].(*TarXzDecompressor).FileSizeLimit)
38+
39+
checkFilesLimit(decompressors["tar.zst"].(*TarZstdDecompressor).FilesLimit)
40+
checkFileSizeLimit(decompressors["tar.zst"].(*TarZstdDecompressor).FileSizeLimit)
41+
42+
checkFilesLimit(decompressors["zip"].(*ZipDecompressor).FilesLimit)
43+
checkFileSizeLimit(decompressors["zip"].(*ZipDecompressor).FileSizeLimit)
44+
45+
// ones with file size limit only
46+
checkFileSizeLimit(decompressors["bz2"].(*Bzip2Decompressor).FileSizeLimit)
47+
checkFileSizeLimit(decompressors["gz"].(*GzipDecompressor).FileSizeLimit)
48+
checkFileSizeLimit(decompressors["xz"].(*XzDecompressor).FileSizeLimit)
49+
checkFileSizeLimit(decompressors["zst"].(*ZstdDecompressor).FileSizeLimit)
50+
}

0 commit comments

Comments
 (0)