diff --git a/internal/pkg/tar.go b/internal/pkg/tar.go index 0aa8e3b..eda4140 100644 --- a/internal/pkg/tar.go +++ b/internal/pkg/tar.go @@ -11,7 +11,6 @@ import ( "io/fs" "net/http" "os" - "path" "hakurei.app/container/check" ) @@ -142,81 +141,66 @@ func (a *tarArtifact) Cure(t *TContext) (err error) { r := tar.NewReader(tr) for header, err = r.Next(); err == nil; header, err = r.Next() { typeflag := header.Typeflag - for { - switch typeflag { - case 0: - if len(header.Name) > 0 && header.Name[len(header.Name)-1] == '/' { - typeflag = tar.TypeDir - } else { - typeflag = tar.TypeReg - } - continue - - case tar.TypeReg: - p := temp.Append(header.Name).String() - if err = os.MkdirAll(path.Dir(p), 0700); err != nil { - return - } - - var f *os.File - if f, err = os.OpenFile( - p, - os.O_CREATE|os.O_EXCL|os.O_WRONLY, - header.FileInfo().Mode()&0500, - ); err != nil { - return - } - if _, err = io.Copy(f, r); err != nil { - _ = f.Close() - return - } else if err = f.Close(); err != nil { - return - } - break - - case tar.TypeLink: - p := temp.Append(header.Name).String() - if err = os.MkdirAll(path.Dir(p), 0700); err != nil { - return - } - if err = os.Link(header.Linkname, p); err != nil { - return - } - break - - case tar.TypeSymlink: - p := temp.Append(header.Name).String() - if err = os.MkdirAll(path.Dir(p), 0700); err != nil { - return - } - if err = os.Symlink(header.Linkname, p); err != nil { - return - } - break - - case tar.TypeDir: - pathname := temp.Append(header.Name) - madeDirectories = append(madeDirectories, dirTargetPerm{ - path: pathname, - mode: header.FileInfo().Mode(), - }) - if err = os.MkdirAll( - pathname.String(), - 0700, - ); err != nil { - return - } - break - - case tar.TypeXGlobalHeader: - // ignore - break - - default: - return DisallowedTypeflagError(typeflag) + if typeflag == 0 { + if len(header.Name) > 0 && header.Name[len(header.Name)-1] == '/' { + typeflag = tar.TypeDir + } else { + typeflag = tar.TypeReg } + } + pathname := temp.Append(header.Name) + if typeflag >= '0' && typeflag <= '9' && typeflag != tar.TypeDir { + if err = os.MkdirAll(pathname.Dir().String(), 0700); err != nil { + return + } + } + + switch typeflag { + case tar.TypeReg: + var f *os.File + if f, err = os.OpenFile( + pathname.String(), + os.O_CREATE|os.O_EXCL|os.O_WRONLY, + header.FileInfo().Mode()&0500, + ); err != nil { + return + } + if _, err = io.Copy(f, r); err != nil { + _ = f.Close() + return + } else if err = f.Close(); err != nil { + return + } break + + case tar.TypeLink: + if err = os.Link(header.Linkname, pathname.String()); err != nil { + return + } + break + + case tar.TypeSymlink: + if err = os.Symlink(header.Linkname, pathname.String()); err != nil { + return + } + break + + case tar.TypeDir: + madeDirectories = append(madeDirectories, dirTargetPerm{ + path: pathname, + mode: header.FileInfo().Mode(), + }) + if err = os.MkdirAll(pathname.String(), 0700); err != nil { + return + } + break + + case tar.TypeXGlobalHeader: + continue // ignore + + default: + return DisallowedTypeflagError(typeflag) } } if errors.Is(err, io.EOF) {