in internal/platform/embed.go [185:249]
func extractTarGz(archivePath string, destPath string) (error, bool) {
archiveFile, err := os.Open(archivePath)
if err != nil {
return err, true
}
defer func(archiveFile *os.File) {
err := archiveFile.Close()
if err != nil {
log.Fatal(err)
}
}(archiveFile)
gzipReader, err := gzip.NewReader(archiveFile)
if err != nil {
return err, true
}
defer func(gzipReader *gzip.Reader) {
err := gzipReader.Close()
if err != nil {
log.Fatal(err)
}
}(gzipReader)
tarReader := tar.NewReader(gzipReader)
for {
header, err := tarReader.Next()
if err == io.EOF {
break
}
if err != nil {
return err, true
}
target := filepath.Join(destPath, header.Name)
if !isInDirectory(destPath, target) {
return fmt.Errorf("%s: illegal file path", target), true
}
switch header.Typeflag {
case tar.TypeDir:
if _, err := os.Stat(target); err != nil {
if err = os.MkdirAll(target, 0755); err != nil {
return err, true
}
}
case tar.TypeReg:
file, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode))
if err != nil {
return err, true
}
if _, err := io.Copy(file, tarReader); err != nil {
err := file.Close()
if err != nil {
return err, true
}
return err, true
}
err = file.Close()
if err != nil {
return err, true
}
}
}
return nil, false
}