Skip to content

Commit 666e5d6

Browse files
committed
Add filemode validation
Signed-off-by: Paulo Gomes <[email protected]>
1 parent 910f245 commit 666e5d6

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed

internal/tgz/tgz.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ package tgz
33
import (
44
"archive/tar"
55
"compress/gzip"
6+
"errors"
67
"fmt"
78
"io"
9+
"io/fs"
10+
"math"
811
"os"
912

1013
"github.com/go-git/go-billy/v5"
@@ -48,18 +51,31 @@ func zipTarReader(r io.Reader) (*tar.Reader, error) {
4851
return tar.NewReader(zip), nil
4952
}
5053

54+
func filemode(mode int64) (fs.FileMode, error) {
55+
if mode < 0 {
56+
return 0, fmt.Errorf("mode cannot be negative")
57+
}
58+
if mode > math.MaxUint32 {
59+
return 0, fmt.Errorf("mode cannot be greater than max uint32")
60+
}
61+
return os.FileMode(mode), nil
62+
}
63+
5164
func unTar(fs billy.Filesystem, src *tar.Reader) error {
5265
for {
5366
header, err := src.Next()
5467
if err != nil {
55-
if err == io.EOF {
68+
if errors.Is(err, io.EOF) {
5669
break
5770
}
5871
return err
5972
}
6073

6174
dst := header.Name
62-
mode := os.FileMode(header.Mode)
75+
mode, err := filemode(header.Mode)
76+
if err != nil {
77+
return err
78+
}
6379
switch header.Typeflag {
6480
case tar.TypeDir:
6581
err := fs.MkdirAll(dst, mode)

0 commit comments

Comments
 (0)