in wrappers/golang/pgadapter.go [542:595]
func unpackJar(ctx context.Context, tarGzFile string) error {
dst := filepath.Dir(tarGzFile)
reader, err := os.Open(tarGzFile)
if err != nil {
return err
}
gzr, err := gzip.NewReader(reader)
if err != nil {
return err
}
defer gzr.Close()
tr := tar.NewReader(gzr)
for {
header, err := tr.Next()
switch {
// if no more files are found return
case err == io.EOF:
return nil
// return any other error
case err != nil:
return err
case header == nil:
continue
}
// Make sure that there are no relative paths in the gzipped file that could overwrite any existing files on
// this system.
if strings.Contains(header.Name, "..") {
return fmt.Errorf("zipped file contains relative path: %s", header.Name)
}
target := filepath.Join(dst, header.Name)
// check the file type
switch header.Typeflag {
// if it's a dir, and it doesn't exist, then create it
case tar.TypeDir:
if _, err := os.Stat(target); err != nil {
if err := os.MkdirAll(target, 0755); err != nil {
return err
}
}
// if it's a file create it
case tar.TypeReg:
f, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode))
if err != nil {
return err
}
if _, err := io.Copy(f, tr); err != nil {
return err
}
_ = f.Close()
}
}
}