Skip to content
This repository was archived by the owner on Mar 27, 2024. It is now read-only.

Commit 35f354a

Browse files
committed
Set/unset write bit on unwriteable directories when unpacking tars
1 parent 61130d5 commit 35f354a

File tree

5 files changed

+29
-2
lines changed

5 files changed

+29
-2
lines changed

Gopkg.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

differs/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ go_library(
77
"differs.go",
88
"file_diff.go",
99
"history_diff.go",
10+
"metadata_diff.go",
1011
"node_diff.go",
1112
"package_differs.go",
1213
"pip_diff.go",

pkg/util/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ go_library(
2424
"//vendor/github.com/containers/image/types:go_default_library",
2525
"//vendor/github.com/docker/docker/client:go_default_library",
2626
"//vendor/github.com/docker/docker/pkg/system:go_default_library",
27+
"//vendor/github.com/pkg/errors:go_default_library",
2728
"//vendor/github.com/sirupsen/logrus:go_default_library",
2829
],
2930
)

pkg/util/image_prep_utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ func CleanupImage(image Image) {
237237
if image.FSPath != "" {
238238
logrus.Infof("Removing image filesystem directory %s from system", image.FSPath)
239239
if err := os.RemoveAll(image.FSPath); err != nil {
240-
logrus.Error(err.Error())
240+
logrus.Warn(err.Error())
241241
}
242242
}
243243
}

pkg/util/tar_utils.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,13 @@ import (
3030
// Map of target:linkname
3131
var hardlinks = make(map[string]string)
3232

33+
type OriginalPerm struct {
34+
path string
35+
perm os.FileMode
36+
}
37+
3338
func unpackTar(tr *tar.Reader, path string, whitelist []string) error {
39+
originalPerms := make([]OriginalPerm, 0)
3440
for {
3541
header, err := tr.Next()
3642
if err == io.EOF {
@@ -68,6 +74,17 @@ func unpackTar(tr *tar.Reader, path string, whitelist []string) error {
6874
// if its a dir and it doesn't exist create it
6975
case tar.TypeDir:
7076
if _, err := os.Stat(target); os.IsNotExist(err) {
77+
if mode.Perm()&(1<<(uint(7))) == 0 {
78+
logrus.Debugf("Write permission bit not set on %s by default; setting manually", target)
79+
originalMode := mode
80+
mode = mode | (1 << uint(7))
81+
// keep track of original file permission to reset later
82+
originalPerms = append(originalPerms, OriginalPerm{
83+
path: target,
84+
perm: originalMode,
85+
})
86+
}
87+
logrus.Debugf("Creating directory %s with permissions %v", target, mode)
7188
if err := os.MkdirAll(target, mode); err != nil {
7289
return err
7390
}
@@ -96,6 +113,7 @@ func unpackTar(tr *tar.Reader, path string, whitelist []string) error {
96113
}
97114
}
98115

116+
logrus.Debugf("Creating file %s with permissions %v", target, mode)
99117
currFile, err := os.Create(target)
100118
if err != nil {
101119
logrus.Errorf("Error creating file %s %s", target, err)
@@ -145,6 +163,13 @@ func unpackTar(tr *tar.Reader, path string, whitelist []string) error {
145163
}
146164
}
147165
}
166+
167+
// reset all original file
168+
for _, perm := range originalPerms {
169+
if err := os.Chmod(perm.path, perm.perm); err != nil {
170+
return err
171+
}
172+
}
148173
return nil
149174
}
150175

0 commit comments

Comments
 (0)