lib/fs: Improve error messages checking file paths (fixes #7942) (#8148)

This commit is contained in:
Simon Frei 2022-01-29 18:47:55 +01:00 committed by GitHub
parent 73e2e2a794
commit 8763fb05ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 4 deletions

View File

@ -23,7 +23,6 @@ var (
errInvalidFilenameWindowsSpacePeriod = errors.New("name is invalid, must not end in space or period on Windows") errInvalidFilenameWindowsSpacePeriod = errors.New("name is invalid, must not end in space or period on Windows")
errInvalidFilenameWindowsReservedName = errors.New("name is invalid, contains Windows reserved name (NUL, COM1, etc.)") errInvalidFilenameWindowsReservedName = errors.New("name is invalid, contains Windows reserved name (NUL, COM1, etc.)")
errInvalidFilenameWindowsReservedChar = errors.New("name is invalid, contains Windows reserved character (?, *, etc.)") errInvalidFilenameWindowsReservedChar = errors.New("name is invalid, contains Windows reserved character (?, *, etc.)")
errNotRelative = errors.New("not a relative path")
) )
type OptionJunctionsAsDirs struct{} type OptionJunctionsAsDirs struct{}

View File

@ -249,6 +249,11 @@ func IsInternal(file string) bool {
return false return false
} }
var (
errPathInvalid = errors.New("path is invalid")
errPathTraversingUpwards = errors.New("relative path traversing upwards (starting with ..)")
)
// Canonicalize checks that the file path is valid and returns it in the "canonical" form: // Canonicalize checks that the file path is valid and returns it in the "canonical" form:
// - /foo/bar -> foo/bar // - /foo/bar -> foo/bar
// - / -> "." // - / -> "."
@ -259,7 +264,7 @@ func Canonicalize(file string) (string, error) {
// The relative path may pretend to be an absolute path within // The relative path may pretend to be an absolute path within
// the root, but the double path separator on Windows implies // the root, but the double path separator on Windows implies
// something else and is out of spec. // something else and is out of spec.
return "", errNotRelative return "", errPathInvalid
} }
// The relative path should be clean from internal dotdots and similar // The relative path should be clean from internal dotdots and similar
@ -268,10 +273,10 @@ func Canonicalize(file string) (string, error) {
// It is not acceptable to attempt to traverse upwards. // It is not acceptable to attempt to traverse upwards.
if file == ".." { if file == ".." {
return "", errNotRelative return "", errPathTraversingUpwards
} }
if strings.HasPrefix(file, ".."+pathSep) { if strings.HasPrefix(file, ".."+pathSep) {
return "", errNotRelative return "", errPathTraversingUpwards
} }
if strings.HasPrefix(file, pathSep) { if strings.HasPrefix(file, pathSep) {