From 3af51736f3f19659d723f60aa480578fae2cddbc Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Thu, 7 Dec 2017 18:44:44 +0100 Subject: [PATCH] fusefrontend_reverse: Use openBackingDir in GetAttr Also fixes 48bd59f38843e5ebd4e4c9f666f1aea1c9990803 - the directory FD should also be closed in case of an error. --- internal/fusefrontend_reverse/rfs.go | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/internal/fusefrontend_reverse/rfs.go b/internal/fusefrontend_reverse/rfs.go index 48a9bfe..220ed37 100644 --- a/internal/fusefrontend_reverse/rfs.go +++ b/internal/fusefrontend_reverse/rfs.go @@ -146,22 +146,17 @@ func (rfs *ReverseFS) GetAttr(relPath string, context *fuse.Context) (*fuse.Attr } return &a, status } - // Decrypt path to "plaintext relative path" - pRelPath, err := rfs.decryptPath(relPath) + dirfd, name, err := rfs.openBackingDir(relPath) if err != nil { return nil, fuse.ToStatus(err) } // Stat the backing file/dir using Fstatat var st unix.Stat_t - dirFd, err := syscallcompat.OpenNofollow(rfs.args.Cipherdir, filepath.Dir(pRelPath), syscall.O_RDONLY|syscall.O_DIRECTORY, 0) + err = syscallcompat.Fstatat(dirfd, name, &st, unix.AT_SYMLINK_NOFOLLOW) + syscall.Close(dirfd) if err != nil { return nil, fuse.ToStatus(err) } - err = syscallcompat.Fstatat(dirFd, filepath.Base(pRelPath), &st, unix.AT_SYMLINK_NOFOLLOW) - if err != nil { - return nil, fuse.ToStatus(err) - } - syscall.Close(dirFd) // Instead of risking an inode number collision, we return an error. if st.Ino > inoBaseMin { tlog.Warn.Printf("GetAttr %q: backing file inode number %d crosses reserved space, max=%d. Returning EOVERFLOW.",