diff --git a/internal/pkg/archive.go b/internal/pkg/archive.go index 902d2c31..9f1b42d9 100644 --- a/internal/pkg/archive.go +++ b/internal/pkg/archive.go @@ -142,10 +142,7 @@ func (ar *Reader) Next() (*ArchiveHeader, error) { } } - if n, err := ar.r.Read(ar.buf[:]); err != nil { - if errors.Is(err, io.EOF) && n != 0 { - err = io.ErrUnexpectedEOF - } + if _, err := io.ReadFull(ar.r, ar.buf[:]); err != nil { return nil, err } @@ -157,13 +154,9 @@ func (ar *Reader) Next() (*ArchiveHeader, error) { pPathSize := alignSize(pathSize) buf := make([]byte, pPathSize) - if n, err := ar.r.Read(buf); err != nil { + if _, err := io.ReadFull(ar.r, buf); err != nil { if errors.Is(err, io.EOF) { - if n != len(buf) { - return nil, io.ErrUnexpectedEOF - } - h.Path = unsafe.String(unsafe.SliceData(buf), pathSize) - return &h, err + err = io.ErrUnexpectedEOF } return nil, err } @@ -330,6 +323,12 @@ func (a archiveArtifact) Cure(t *TContext) (err error) { } }() + type dirTargetPerm struct { + path string + mode fs.FileMode + } + var madeDirectories []dirTargetPerm + if err = os.MkdirAll(t.GetWorkDir().String(), 0700); err != nil { return } @@ -379,7 +378,11 @@ func (a archiveArtifact) Cure(t *TContext) (err error) { continue } - if err = root.Mkdir(header.Path, header.Mode.Perm()); err != nil { + madeDirectories = append(madeDirectories, dirTargetPerm{ + path: header.Path, + mode: header.Mode, + }) + if err = root.Mkdir(header.Path, 0700); err != nil { return } } else { @@ -389,5 +392,14 @@ func (a archiveArtifact) Cure(t *TContext) (err error) { if errors.Is(err, io.EOF) { err = nil } + if err == nil { + for _, e := range madeDirectories { + if err = root.Chmod(e.path, e.mode.Perm()); err != nil { + return + } + } + } else { + return + } return }