refactor: Clean incoming filepaths before passing them to STFS
This commit is contained in:
@@ -97,6 +97,8 @@ func (f *STFS) Create(name string) (afero.File, error) {
|
|||||||
return nil, os.ErrInvalid
|
return nil, os.ErrInvalid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name = cleanName(name)
|
||||||
|
|
||||||
if _, err := inventory.Stat(
|
if _, err := inventory.Stat(
|
||||||
f.metadata,
|
f.metadata,
|
||||||
|
|
||||||
@@ -281,6 +283,8 @@ func (f *STFS) Mkdir(name string, perm os.FileMode) error {
|
|||||||
return os.ErrPermission
|
return os.ErrPermission
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name = cleanName(name)
|
||||||
|
|
||||||
f.ioLock.Lock()
|
f.ioLock.Lock()
|
||||||
defer f.ioLock.Unlock()
|
defer f.ioLock.Unlock()
|
||||||
|
|
||||||
@@ -323,6 +327,8 @@ func (f *STFS) MkdirAll(path string, perm os.FileMode) error {
|
|||||||
return os.ErrPermission
|
return os.ErrPermission
|
||||||
}
|
}
|
||||||
|
|
||||||
|
path = cleanName(path)
|
||||||
|
|
||||||
f.ioLock.Lock()
|
f.ioLock.Lock()
|
||||||
defer f.ioLock.Unlock()
|
defer f.ioLock.Unlock()
|
||||||
|
|
||||||
@@ -366,6 +372,8 @@ func (f *STFS) Open(name string) (afero.File, error) {
|
|||||||
return nil, os.ErrInvalid
|
return nil, os.ErrInvalid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name = cleanName(name)
|
||||||
|
|
||||||
return f.OpenFile(name, os.O_RDONLY, 0)
|
return f.OpenFile(name, os.O_RDONLY, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -380,6 +388,8 @@ func (f *STFS) OpenFile(name string, flag int, perm os.FileMode) (afero.File, er
|
|||||||
return nil, os.ErrInvalid
|
return nil, os.ErrInvalid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name = cleanName(name)
|
||||||
|
|
||||||
f.ioLock.Lock()
|
f.ioLock.Lock()
|
||||||
defer f.ioLock.Unlock()
|
defer f.ioLock.Unlock()
|
||||||
|
|
||||||
@@ -496,6 +506,8 @@ func (f *STFS) Remove(name string) error {
|
|||||||
return os.ErrPermission
|
return os.ErrPermission
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name = cleanName(name)
|
||||||
|
|
||||||
f.ioLock.Lock()
|
f.ioLock.Lock()
|
||||||
defer f.ioLock.Unlock()
|
defer f.ioLock.Unlock()
|
||||||
|
|
||||||
@@ -557,6 +569,8 @@ func (f *STFS) RemoveAll(path string) error {
|
|||||||
return os.ErrPermission
|
return os.ErrPermission
|
||||||
}
|
}
|
||||||
|
|
||||||
|
path = cleanName(path)
|
||||||
|
|
||||||
f.ioLock.Lock()
|
f.ioLock.Lock()
|
||||||
defer f.ioLock.Unlock()
|
defer f.ioLock.Unlock()
|
||||||
|
|
||||||
@@ -586,6 +600,9 @@ func (f *STFS) Rename(oldname, newname string) error {
|
|||||||
return os.ErrInvalid
|
return os.ErrInvalid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
oldname = cleanName(oldname)
|
||||||
|
newname = cleanName(newname)
|
||||||
|
|
||||||
f.ioLock.Lock()
|
f.ioLock.Lock()
|
||||||
defer f.ioLock.Unlock()
|
defer f.ioLock.Unlock()
|
||||||
|
|
||||||
@@ -652,6 +669,8 @@ func (f *STFS) Stat(name string) (os.FileInfo, error) {
|
|||||||
"name": name,
|
"name": name,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
name = cleanName(name)
|
||||||
|
|
||||||
f.ioLock.Lock()
|
f.ioLock.Lock()
|
||||||
defer f.ioLock.Unlock()
|
defer f.ioLock.Unlock()
|
||||||
|
|
||||||
@@ -718,6 +737,8 @@ func (f *STFS) Chmod(name string, mode os.FileMode) error {
|
|||||||
return os.ErrInvalid
|
return os.ErrInvalid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name = cleanName(name)
|
||||||
|
|
||||||
f.ioLock.Lock()
|
f.ioLock.Lock()
|
||||||
defer f.ioLock.Unlock()
|
defer f.ioLock.Unlock()
|
||||||
|
|
||||||
@@ -757,6 +778,8 @@ func (f *STFS) Chown(name string, uid, gid int) error {
|
|||||||
return os.ErrInvalid
|
return os.ErrInvalid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name = cleanName(name)
|
||||||
|
|
||||||
f.ioLock.Lock()
|
f.ioLock.Lock()
|
||||||
defer f.ioLock.Unlock()
|
defer f.ioLock.Unlock()
|
||||||
|
|
||||||
@@ -797,6 +820,8 @@ func (f *STFS) Chtimes(name string, atime time.Time, mtime time.Time) error {
|
|||||||
return os.ErrInvalid
|
return os.ErrInvalid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name = cleanName(name)
|
||||||
|
|
||||||
f.ioLock.Lock()
|
f.ioLock.Lock()
|
||||||
defer f.ioLock.Unlock()
|
defer f.ioLock.Unlock()
|
||||||
|
|
||||||
@@ -827,10 +852,6 @@ func (f *STFS) lstatIfPossibleWithoutLocking(name string) (os.FileInfo, bool, er
|
|||||||
"name": name,
|
"name": name,
|
||||||
})
|
})
|
||||||
|
|
||||||
if checkName(name) {
|
|
||||||
return nil, true, os.ErrInvalid
|
|
||||||
}
|
|
||||||
|
|
||||||
hdr, err := inventory.Stat(
|
hdr, err := inventory.Stat(
|
||||||
f.metadata,
|
f.metadata,
|
||||||
|
|
||||||
@@ -859,6 +880,8 @@ func (f *STFS) LstatIfPossible(name string) (os.FileInfo, bool, error) {
|
|||||||
return nil, true, os.ErrInvalid
|
return nil, true, os.ErrInvalid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name = cleanName(name)
|
||||||
|
|
||||||
f.ioLock.Lock()
|
f.ioLock.Lock()
|
||||||
defer f.ioLock.Unlock()
|
defer f.ioLock.Unlock()
|
||||||
|
|
||||||
@@ -883,6 +906,9 @@ func (f *STFS) SymlinkIfPossible(oldname, newname string) error {
|
|||||||
return os.ErrInvalid
|
return os.ErrInvalid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
oldname = cleanName(oldname)
|
||||||
|
newname = cleanName(newname)
|
||||||
|
|
||||||
f.ioLock.Lock()
|
f.ioLock.Lock()
|
||||||
defer f.ioLock.Unlock()
|
defer f.ioLock.Unlock()
|
||||||
|
|
||||||
@@ -898,6 +924,8 @@ func (f *STFS) ReadlinkIfPossible(name string) (string, error) {
|
|||||||
return "", os.ErrInvalid
|
return "", os.ErrInvalid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name = cleanName(name)
|
||||||
|
|
||||||
f.ioLock.Lock()
|
f.ioLock.Lock()
|
||||||
defer f.ioLock.Unlock()
|
defer f.ioLock.Unlock()
|
||||||
|
|
||||||
@@ -912,3 +940,7 @@ func (f *STFS) ReadlinkIfPossible(name string) (string, error) {
|
|||||||
func checkName(name string) bool {
|
func checkName(name string) bool {
|
||||||
return len(name) == 0
|
return len(name) == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func cleanName(name string) string {
|
||||||
|
return filepath.Clean(name)
|
||||||
|
}
|
||||||
|
|||||||
@@ -639,6 +639,11 @@ var createTests = []struct {
|
|||||||
createArgs{"/test.txt"},
|
createArgs{"/test.txt"},
|
||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"Can create file /test.txt/",
|
||||||
|
createArgs{"/test.txt/"},
|
||||||
|
false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"Can not create existing file/directory /",
|
"Can not create existing file/directory /",
|
||||||
createArgs{"/"},
|
createArgs{"/"},
|
||||||
|
|||||||
Reference in New Issue
Block a user