diff options
-rw-r--r-- | internal/fusefrontend_reverse/node.go | 12 | ||||
-rw-r--r-- | internal/fusefrontend_reverse/rpath.go | 20 |
2 files changed, 20 insertions, 12 deletions
diff --git a/internal/fusefrontend_reverse/node.go b/internal/fusefrontend_reverse/node.go index a102a66..8af7bed 100644 --- a/internal/fusefrontend_reverse/node.go +++ b/internal/fusefrontend_reverse/node.go @@ -21,14 +21,14 @@ type Node struct { // Lookup - FUSE call for discovering a file. // TODO handle virtual files func (n *Node) Lookup(ctx context.Context, name string, out *fuse.EntryOut) (ch *fs.Inode, errno syscall.Errno) { - dirfd, cName, errno := n.prepareAtSyscall(name) + dirfd, pName, errno := n.prepareAtSyscall(name) if errno != 0 { return } defer syscall.Close(dirfd) // Get device number and inode number into `st` - st, err := syscallcompat.Fstatat2(dirfd, cName, unix.AT_SYMLINK_NOFOLLOW) + st, err := syscallcompat.Fstatat2(dirfd, pName, unix.AT_SYMLINK_NOFOLLOW) if err != nil { return nil, fs.ToErrno(err) } @@ -37,7 +37,7 @@ func (n *Node) Lookup(ctx context.Context, name string, out *fuse.EntryOut) (ch ch = n.newChild(ctx, st, out) // Translate ciphertext size in `out.Attr.Size` to plaintext size - n.translateSize(dirfd, cName, &out.Attr) + n.translateSize(dirfd, pName, &out.Attr) return ch, 0 } @@ -51,13 +51,13 @@ func (n *Node) Getattr(ctx context.Context, f fs.FileHandle, out *fuse.AttrOut) return f.(fs.FileGetattrer).Getattr(ctx, out) } - dirfd, cName, errno := n.prepareAtSyscall("") + dirfd, pName, errno := n.prepareAtSyscall("") if errno != 0 { return } defer syscall.Close(dirfd) - st, err := syscallcompat.Fstatat2(dirfd, cName, unix.AT_SYMLINK_NOFOLLOW) + st, err := syscallcompat.Fstatat2(dirfd, pName, unix.AT_SYMLINK_NOFOLLOW) if err != nil { return fs.ToErrno(err) } @@ -68,7 +68,7 @@ func (n *Node) Getattr(ctx context.Context, f fs.FileHandle, out *fuse.AttrOut) out.Attr.FromStat(st) // Translate ciphertext size in `out.Attr.Size` to plaintext size - n.translateSize(dirfd, cName, &out.Attr) + n.translateSize(dirfd, pName, &out.Attr) if rn.args.ForceOwner != nil { out.Owner = *rn.args.ForceOwner diff --git a/internal/fusefrontend_reverse/rpath.go b/internal/fusefrontend_reverse/rpath.go index ed37847..35b9361 100644 --- a/internal/fusefrontend_reverse/rpath.go +++ b/internal/fusefrontend_reverse/rpath.go @@ -64,11 +64,11 @@ func (rfs *RootNode) rDecryptName(cName string, dirIV []byte, pDir string) (pNam // decryptPath decrypts a relative ciphertext path to a relative plaintext // path. -func (rn *RootNode) decryptPath(relPath string) (string, error) { - if rn.args.PlaintextNames || relPath == "" { - return relPath, nil +func (rn *RootNode) decryptPath(cPath string) (string, error) { + if rn.args.PlaintextNames || cPath == "" { + return cPath, nil } - parts := strings.Split(relPath, "/") + parts := strings.Split(cPath, "/") var transformedParts []string for i := range parts { // Start at the top and recurse @@ -90,12 +90,20 @@ func (rn *RootNode) decryptPath(relPath string) (string, error) { // and returns the fd to the directory and the decrypted name of the // target file. The fd/name pair is intended for use with fchownat and // friends. -func (rn *RootNode) openBackingDir(pRelPath string) (dirfd int, pName string, err error) { +func (rn *RootNode) openBackingDir(cPath string) (dirfd int, pName string, err error) { + defer func() { + tlog.Debug.Printf("openBackingDir %q -> %d %q %v\n", cPath, dirfd, pName, err) + }() + dirfd = -1 + pRelPath, err := rn.decryptPath(cPath) + if err != nil { + return + } // Open directory, safe against symlink races pDir := filepath.Dir(pRelPath) dirfd, err = syscallcompat.OpenDirNofollow(rn.args.Cipherdir, pDir) if err != nil { - return -1, "", err + return } pName = filepath.Base(pRelPath) return dirfd, pName, nil |