From 65a445d4d01c09f43676180d779abbff0de40f1e Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Tue, 18 Jan 2022 23:43:35 -0800 Subject: filesystem: add back canonicalizePath() Restore the canonicalizePath() function from before commit f2eb79fb5fb10275c014b55c13e28ff02d3b70a8, since it's needed again. Update https://github.com/google/fscrypt/issues/339 --- filesystem/path.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'filesystem/path.go') diff --git a/filesystem/path.go b/filesystem/path.go index 274dc0a..fa38701 100644 --- a/filesystem/path.go +++ b/filesystem/path.go @@ -23,6 +23,7 @@ import ( "fmt" "log" "os" + "path/filepath" "golang.org/x/sys/unix" @@ -40,6 +41,22 @@ func OpenFileOverridingUmask(name string, flag int, perm os.FileMode) (*os.File, // We only check the unix permissions and the sticky bit const permMask = os.ModeSticky | os.ModePerm +// canonicalizePath turns path into an absolute path without symlinks. +func canonicalizePath(path string) (string, error) { + path, err := filepath.Abs(path) + if err != nil { + return "", err + } + path, err = filepath.EvalSymlinks(path) + + // Get a better error if we have an invalid path + if pathErr, ok := err.(*os.PathError); ok { + err = errors.Wrap(pathErr.Err, pathErr.Path) + } + + return path, err +} + // loggedStat runs os.Stat, but it logs the error if stat returns any error // other than nil or IsNotExist. func loggedStat(name string) (os.FileInfo, error) { -- cgit v1.2.3