aboutsummaryrefslogtreecommitdiff
path: root/internal/fusefrontend/fs.go
diff options
context:
space:
mode:
authorSebastian Lackner2017-11-29 12:54:34 +0100
committerSebastian Lackner2017-11-29 12:55:41 +0100
commit0162392a28b75ccb6c3b26c26f2a83b5973a2d92 (patch)
treefe34b074fc11a2a9d73e88cc324e7cfd35b60b6c /internal/fusefrontend/fs.go
parent0f44c617d01f3e203933459be5fb64c1904d40b6 (diff)
fusefrontend: Use Fchmodat to implement Chmod
Diffstat (limited to 'internal/fusefrontend/fs.go')
-rw-r--r--internal/fusefrontend/fs.go7
1 files changed, 4 insertions, 3 deletions
diff --git a/internal/fusefrontend/fs.go b/internal/fusefrontend/fs.go
index 002b4e1..c4035fa 100644
--- a/internal/fusefrontend/fs.go
+++ b/internal/fusefrontend/fs.go
@@ -239,13 +239,14 @@ func (fs *FS) Chmod(path string, mode uint32, context *fuse.Context) (code fuse.
if fs.isFiltered(path) {
return fuse.EPERM
}
- cPath, err := fs.getBackingPath(path)
+ dirfd, cName, err := fs.openBackingPath(path)
if err != nil {
return fuse.ToStatus(err)
}
+ defer dirfd.Close()
// os.Chmod goes through the "syscallMode" translation function that messes
- // up the suid and sgid bits. So use syscall.Chmod directly.
- err = syscall.Chmod(cPath, mode)
+ // up the suid and sgid bits. So use a syscall directly.
+ err = syscallcompat.Fchmodat(int(dirfd.Fd()), cName, mode, unix.AT_SYMLINK_NOFOLLOW)
return fuse.ToStatus(err)
}