diff options
author | Jakob Unterwurzacher | 2023-05-17 23:26:56 +0200 |
---|---|---|
committer | Jakob Unterwurzacher | 2023-05-17 23:26:56 +0200 |
commit | 09954c4bdecf0ca6da65776f176dc934ffced2b0 (patch) | |
tree | ad35e8f5edc62572c93c962b26a8f97f1eab0de5 /internal/fusefrontend | |
parent | 7d1e48d195b827ee00bfd0ab0421a395b1ec0ea7 (diff) |
fusefrontend: implement our own Access()
Not having Access() means go-fuse emulates it by looking at Getattr().
This works fine most of the time, but breaks down on sshfs, where
sshfs-benchmark.bash shows this:
gocryptfs/tests$ ./sshfs-benchmark.bash nuetzlich.net
working directory: /tmp/sshfs-benchmark.bash.JQC
sshfs mounted: nuetzlich.net:/tmp -> sshfs.mnt
gocryptfs mounted: sshfs.mnt/sshfs-benchmark.bash.Wrz/gocryptfs.crypt -> gocryptfs.mnt
sshfs-benchmark.bash: sshfs gocryptfs-on-sshfs
git init 3.98 6.80
rsync 7.71 10.84
rm -R 4.30rm: descend into write-protected directory 'gocryptfs.mnt/git1'?
The go-fuse emulation gets it wrong here because sshfs reports
permissions but does not enforce them.
Implement it ourselves properly.
Diffstat (limited to 'internal/fusefrontend')
-rw-r--r-- | internal/fusefrontend/node.go | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/internal/fusefrontend/node.go b/internal/fusefrontend/node.go index 274123b..687a386 100644 --- a/internal/fusefrontend/node.go +++ b/internal/fusefrontend/node.go @@ -99,6 +99,17 @@ func (n *Node) Getattr(ctx context.Context, f fs.FileHandle, out *fuse.AttrOut) return 0 } +func (n *Node) Access(ctx context.Context, mode uint32) syscall.Errno { + dirfd, cName, errno := n.prepareAtSyscallMyself() + if errno != 0 { + return errno + } + defer syscall.Close(dirfd) + + err := syscallcompat.Faccessat(dirfd, cName, mode) + return fs.ToErrno(err) +} + // Unlink - FUSE call. Delete a file. // // Symlink-safe through use of Unlinkat(). |