Skip to content

Commit dac4d24

Browse files
committed
Ensure file path exists
1 parent 51ba3ef commit dac4d24

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

internal/ebutil/mock_mounter_test.go

+15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/ebutil/remount.go

+15-2
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,13 @@ func remount(m mounter, src, dest string) error {
101101
if err := m.MkdirAll(destDir, 0o750); err != nil {
102102
return fmt.Errorf("ensure path: %w", err)
103103
}
104+
if !stat.IsDir() {
105+
f, err := m.OpenFile(dest, os.O_CREATE, 0o640)
106+
if err != nil {
107+
return fmt.Errorf("ensure file path: %w", err)
108+
}
109+
defer f.Close()
110+
}
104111
if err := m.Mount(src, dest, "bind", syscall.MS_BIND, ""); err != nil {
105112
return fmt.Errorf("bind mount %s => %s: %w", src, dest, err)
106113
}
@@ -114,14 +121,16 @@ func remount(m mounter, src, dest string) error {
114121
type mounter interface {
115122
// GetMounts wraps procfs.GetMounts
116123
GetMounts() ([]*procfs.MountInfo, error)
124+
// Stat wraps os.Stat
125+
Stat(string) (os.FileInfo, error)
117126
// MkdirAll wraps os.MkdirAll
118127
MkdirAll(string, os.FileMode) error
128+
// OpenFile wraps os.OpenFile
129+
OpenFile(string, int, os.FileMode) (*os.File, error)
119130
// Mount wraps syscall.Mount
120131
Mount(string, string, string, uintptr, string) error
121132
// Unmount wraps syscall.Unmount
122133
Unmount(string, int) error
123-
// Stat wraps os.Stat
124-
Stat(string) (os.FileInfo, error)
125134
}
126135

127136
// realMounter implements mounter and actually does the thing.
@@ -145,6 +154,10 @@ func (m *realMounter) MkdirAll(path string, perm os.FileMode) error {
145154
return os.MkdirAll(path, perm)
146155
}
147156

157+
func (m *realMounter) OpenFile(name string, flag int, perm os.FileMode) (*os.File, error) {
158+
return os.OpenFile(name, flag, perm)
159+
}
160+
148161
func (m *realMounter) Stat(path string) (os.FileInfo, error) {
149162
return os.Stat(path)
150163
}

internal/ebutil/remount_internal_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,12 @@ func Test_tempRemount(t *testing.T) {
5353
mm.EXPECT().GetMounts().Return(mounts, nil)
5454
mm.EXPECT().Stat("/usr/bin/utility").Return(&fakeFileInfo{isDir: false}, nil)
5555
mm.EXPECT().MkdirAll("/.test/usr/bin", os.FileMode(0o750)).Times(1).Return(nil)
56+
mm.EXPECT().OpenFile("/.test/usr/bin/utility", os.O_CREATE, os.FileMode(0o640)).Times(1).Return(new(os.File), nil)
5657
mm.EXPECT().Mount("/usr/bin/utility", "/.test/usr/bin/utility", "bind", uintptr(syscall.MS_BIND), "").Times(1).Return(nil)
5758
mm.EXPECT().Unmount("/usr/bin/utility", 0).Times(1).Return(nil)
5859
mm.EXPECT().Stat("/.test/usr/bin/utility").Return(&fakeFileInfo{isDir: false}, nil)
5960
mm.EXPECT().MkdirAll("/usr/bin", os.FileMode(0o750)).Times(1).Return(nil)
61+
mm.EXPECT().OpenFile("/usr/bin/utility", os.O_CREATE, os.FileMode(0o640)).Times(1).Return(new(os.File), nil)
6062
mm.EXPECT().Mount("/.test/usr/bin/utility", "/usr/bin/utility", "bind", uintptr(syscall.MS_BIND), "").Times(1).Return(nil)
6163
mm.EXPECT().Unmount("/.test/usr/bin/utility", 0).Times(1).Return(nil)
6264

0 commit comments

Comments
 (0)