From 8763fb05ec281ddc30c8370fd55cd5d46aa0e809 Mon Sep 17 00:00:00 2001 From: Simon Frei Date: Sat, 29 Jan 2022 18:47:55 +0100 Subject: [PATCH] lib/fs: Improve error messages checking file paths (fixes #7942) (#8148) --- lib/fs/basicfs.go | 1 - lib/fs/filesystem.go | 11 ++++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/fs/basicfs.go b/lib/fs/basicfs.go index db5bb97cb..28392e703 100644 --- a/lib/fs/basicfs.go +++ b/lib/fs/basicfs.go @@ -23,7 +23,6 @@ var ( 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.)") errInvalidFilenameWindowsReservedChar = errors.New("name is invalid, contains Windows reserved character (?, *, etc.)") - errNotRelative = errors.New("not a relative path") ) type OptionJunctionsAsDirs struct{} diff --git a/lib/fs/filesystem.go b/lib/fs/filesystem.go index c19860dd4..d2af30518 100644 --- a/lib/fs/filesystem.go +++ b/lib/fs/filesystem.go @@ -249,6 +249,11 @@ func IsInternal(file string) bool { 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: // - /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 root, but the double path separator on Windows implies // something else and is out of spec. - return "", errNotRelative + return "", errPathInvalid } // 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. if file == ".." { - return "", errNotRelative + return "", errPathTraversingUpwards } if strings.HasPrefix(file, ".."+pathSep) { - return "", errNotRelative + return "", errPathTraversingUpwards } if strings.HasPrefix(file, pathSep) {