aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/pkg/tar.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-01-06 05:55:24 +0900
committerOphestra <cat@gensokyo.uk>2026-01-06 05:55:24 +0900
commitf6d32e482a391ee9b095bb58f3476dd75420fc64 (patch)
tree0abd1fc47553eabbe64e962d0aeb8cdbe42a6b20 /internal/pkg/tar.go
parent79adf217f4ca94fdfeb8a190fc7dc49fd26254dd (diff)
internal/pkg: ensure parent for non-directory entries
This works around streams containing out of order entries. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/pkg/tar.go')
-rw-r--r--internal/pkg/tar.go26
1 files changed, 17 insertions, 9 deletions
diff --git a/internal/pkg/tar.go b/internal/pkg/tar.go
index 0d1c5724..5444aab8 100644
--- a/internal/pkg/tar.go
+++ b/internal/pkg/tar.go
@@ -11,6 +11,7 @@ import (
"io/fs"
"net/http"
"os"
+ "path"
"hakurei.app/container/check"
)
@@ -128,9 +129,14 @@ func (a *tarArtifact) Cure(c *CureContext) (err error) {
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(
- temp.Append(header.Name).String(),
+ p,
os.O_CREATE|os.O_EXCL|os.O_WRONLY,
header.FileInfo().Mode()&0400,
); err != nil {
@@ -145,19 +151,21 @@ func (a *tarArtifact) Cure(c *CureContext) (err error) {
break
case tar.TypeLink:
- if err = os.Link(
- header.Linkname,
- temp.Append(header.Name).String(),
- ); err != nil {
+ 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:
- if err = os.Symlink(
- header.Linkname,
- temp.Append(header.Name).String(),
- ); err != nil {
+ 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