MCPcopy
hub / github.com/hashicorp/go-getter / untar

Function untar

decompress_tar.go:14–147  ·  view source on GitHub ↗

untar is a shared helper for untarring an archive. The reader should provide an uncompressed view of the tar archive.

(input io.Reader, dst, src string, dir bool, umask os.FileMode, fileSizeLimit int64, filesLimit int)

Source from the content-addressed store, hash-verified

12// untar is a shared helper for untarring an archive. The reader should provide
13// an uncompressed view of the tar archive.
14func untar(input io.Reader, dst, src string, dir bool, umask os.FileMode, fileSizeLimit int64, filesLimit int) error {
15 tarR := tar.NewReader(input)
16 done := false
17 dirHdrs := []*tar.Header{}
18 now := time.Now()
19
20 var (
21 fileSize int64
22 filesCount int
23 )
24
25 for {
26 if filesLimit > 0 {
27 filesCount++
28 if filesCount > filesLimit {
29 return fmt.Errorf("tar archive contains too many files: %d > %d", filesCount, filesLimit)
30 }
31 }
32
33 hdr, err := tarR.Next()
34 if err == io.EOF {
35 if !done {
36 // Empty archive
37 return fmt.Errorf("empty archive: %s", src)
38 }
39
40 break
41 }
42 if err != nil {
43 return err
44 }
45
46 if hdr.Typeflag == tar.TypeXGlobalHeader || hdr.Typeflag == tar.TypeXHeader {
47 // don't unpack extended headers as files
48 continue
49 }
50
51 path := dst
52 if dir {
53 // Disallow parent traversal
54 if containsDotDot(hdr.Name) {
55 return fmt.Errorf("entry contains '..': %s", hdr.Name)
56 }
57
58 path = filepath.Join(path, hdr.Name)
59 }
60
61 fileInfo := hdr.FileInfo()
62
63 fileSize += fileInfo.Size()
64
65 if fileSizeLimit > 0 && fileSize > fileSizeLimit {
66 return fmt.Errorf("tar archive larger than limit: %d", fileSizeLimit)
67 }
68
69 if fileInfo.IsDir() {
70 if !dir {
71 return fmt.Errorf("expected a single file: %s", src)

Callers 5

DecompressMethod · 0.85
DecompressMethod · 0.85
DecompressMethod · 0.85
DecompressMethod · 0.85
DecompressMethod · 0.85

Calls 5

containsDotDotFunction · 0.85
modeFunction · 0.85
copyReaderFunction · 0.85
DirMethod · 0.65
ModeMethod · 0.65

Tested by

no test coverage detected