From fcdb4bec0910dd4bb49f625621fdfb345efc44ae Mon Sep 17 00:00:00 2001
From: Jakob Unterwurzacher
Date: Thu, 3 Jan 2019 15:59:54 +0100
Subject: 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)
-- 
cgit v1.2.3