returnerrors.Wrap(err,"failed to initialize gzip reader")
}
deferuncompressedStream.Close()
tarReader:=tar.NewReader(uncompressedStream)
for{
header,err:=tarReader.Next()
iferr==io.EOF{
break
}elseiferr!=nil{
returnerrors.Wrap(err,"failed to read next file from archive")
}
// Pre-emptively check type flag to avoid reporting a misleading error in
// trying to sanitize the header name.
switchheader.Typeflag{
casetar.TypeDir:
casetar.TypeReg:
default:
mlog.Warn("skipping unsupported header type on extracting tar file",mlog.String("header_type",string(header.Typeflag)),mlog.String("header_name",header.Name))
continue
}
// filepath.HasPrefix is deprecated, so we just use strings.HasPrefix to ensure
// the target path remains rooted at dst and has no `../` escaping outside.
path:=filepath.Join(dst,header.Name)
if!strings.HasPrefix(path,dst){
returnerrors.Errorf("failed to sanitize path %s",header.Name)