MCPcopy Create free account
hub / github.com/devspace-sh/devspace / untarAll

Function untarAll

pkg/devspace/hook/download.go:104–170  ·  view source on GitHub ↗
(reader io.Reader, destDir, prefix string, log logpkg.Logger)

Source from the content-addressed store, hash-verified

102}
103
104func untarAll(reader io.Reader, destDir, prefix string, log logpkg.Logger) error {
105 gw, err := gzip.NewReader(reader)
106 if err != nil {
107 return err
108 }
109 symlinkWarningPrinted := false
110 tarReader := tar.NewReader(gw)
111 for {
112 header, err := tarReader.Next()
113 if err != nil {
114 if err != io.EOF {
115 return err
116 }
117 break
118 }
119
120 // All the files will start with the prefix, which is the directory where
121 // they were located on the pod, we need to strip down that prefix, but
122 // if the prefix is missing it means the tar was tempered with.
123 // For the case where prefix is empty we need to ensure that the path
124 // is not absolute, which also indicates the tar file was tempered with.
125 if !strings.HasPrefix(header.Name, prefix) {
126 return fmt.Errorf("tar contents corrupted")
127 }
128
129 // basic file information
130 mode := header.FileInfo().Mode()
131 destFileName := filepath.Join(destDir, header.Name[len(prefix):])
132
133 if !isDestRelative(destDir, destFileName) {
134 log.Warnf("warning: file %q is outside target destination, skipping", destFileName)
135 continue
136 }
137
138 baseName := filepath.Dir(destFileName)
139 if err := os.MkdirAll(baseName, 0755); err != nil {
140 return err
141 }
142 if header.FileInfo().IsDir() {
143 if err := os.MkdirAll(destFileName, 0755); err != nil {
144 return err
145 }
146 continue
147 }
148
149 if mode&os.ModeSymlink != 0 {
150 if !symlinkWarningPrinted {
151 symlinkWarningPrinted = true
152 log.Warnf("warning: skipping symlink: %q -> %q\n", destFileName, header.Linkname)
153 }
154 continue
155 }
156 outFile, err := os.Create(destFileName)
157 if err != nil {
158 return err
159 }
160 defer outFile.Close()
161 if _, err := io.Copy(outFile, tarReader); err != nil {

Callers 1

downloadFunction · 0.70

Calls 8

isDestRelativeFunction · 0.85
NextMethod · 0.80
CloseMethod · 0.65
CopyMethod · 0.65
ErrorfMethod · 0.45
ModeMethod · 0.45
WarnfMethod · 0.45
IsDirMethod · 0.45

Tested by

no test coverage detected