aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-06-07 20:26:55 +0900
committerOphestra <cat@gensokyo.uk>2026-06-07 20:26:55 +0900
commit9344f694c7d8ec02f118bffa6f556f5b1cc7395c (patch)
treef02ef047d81521dc7e2ba709838a4b1593cd5c6d
parente8bb5a622d0c1895b1768a90d0b422ec084db73f (diff)
internal/pkg: defer directory permissions
This allows creation of directory structures with awkward permission bits. Signed-off-by: Ophestra <cat@gensokyo.uk>
-rw-r--r--internal/pkg/archive.go34
1 files changed, 23 insertions, 11 deletions
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
}