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 | |
| 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')
| -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().  | 
