From fcdb4bec0910dd4bb49f625621fdfb345efc44ae Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Thu, 3 Jan 2019 15:59:54 +0100 Subject: [PATCH] fusefronted: dirCache: fix bug handling "" Bug looked like this: $ ls -l . total 0 drwxrwxr-x. 2 jakob jakob 60 Jan 3 15:42 foo -rw-rw-r--. 1 jakob jakob 0 Jan 3 15:46 x $ ls -l . ls: cannot access '.': No such file or directory (only happened when "" was in the dirCache) --- internal/fusefrontend/openbackingdir.go | 4 ++++ internal/fusefrontend/openbackingdir_test.go | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/internal/fusefrontend/openbackingdir.go b/internal/fusefrontend/openbackingdir.go index 4da7fd6..d56848f 100644 --- a/internal/fusefrontend/openbackingdir.go +++ b/internal/fusefrontend/openbackingdir.go @@ -33,6 +33,10 @@ func (fs *FS) openBackingDir(relPath string) (dirfd int, cName string, err error // Cache lookup dirfd, iv := fs.dirCache.Lookup(dirRelPath) if dirfd > 0 { + // If relPath is empty, cName is ".". + if relPath == "" { + return dirfd, ".", nil + } name := filepath.Base(relPath) cName = fs.nameTransform.EncryptAndHashName(name, iv) return dirfd, cName, nil diff --git a/internal/fusefrontend/openbackingdir_test.go b/internal/fusefrontend/openbackingdir_test.go index f784989..266e265 100644 --- a/internal/fusefrontend/openbackingdir_test.go +++ b/internal/fusefrontend/openbackingdir_test.go @@ -37,6 +37,18 @@ func TestOpenBackingDir(t *testing.T) { if cName != "." { t.Fatal("cName should be .") } + syscall.Close(dirfd) + + // Again, but populate the cache for "" by looking up a non-existing file + fs.GetAttr("xyz1234", nil) + dirfd, cName, err = fs.openBackingDir("") + if err != nil { + t.Fatal(err) + } + if cName != "." { + t.Fatal("cName should be .") + } + err = syscallcompat.Faccessat(dirfd, cName, unix.R_OK) if err != nil { t.Error(err)