diff options
Diffstat (limited to 'internal/fusefrontend')
| -rw-r--r-- | internal/fusefrontend/file.go | 5 | ||||
| -rw-r--r-- | internal/fusefrontend/fs.go | 7 | 
2 files changed, 9 insertions, 3 deletions
| diff --git a/internal/fusefrontend/file.go b/internal/fusefrontend/file.go index 780a792..546526b 100644 --- a/internal/fusefrontend/file.go +++ b/internal/fusefrontend/file.go @@ -459,7 +459,10 @@ func (f *file) Chmod(mode uint32) fuse.Status {  	f.fdLock.RLock()  	defer f.fdLock.RUnlock() -	return fuse.ToStatus(f.fd.Chmod(os.FileMode(mode))) +	// os.File.Chmod goes through the "syscallMode" translation function that messes +	// up the suid and sgid bits. So use syscall.Fchmod directly. +	err := syscall.Fchmod(f.intFd(), mode) +	return fuse.ToStatus(err)  }  func (f *file) Chown(uid uint32, gid uint32) fuse.Status { diff --git a/internal/fusefrontend/fs.go b/internal/fusefrontend/fs.go index 9ae57fa..49bd031 100644 --- a/internal/fusefrontend/fs.go +++ b/internal/fusefrontend/fs.go @@ -158,11 +158,14 @@ func (fs *FS) Chmod(path string, mode uint32, context *fuse.Context) (code fuse.  	if fs.isFiltered(path) {  		return fuse.EPERM  	} -	cPath, err := fs.encryptPath(path) +	cPath, err := fs.getBackingPath(path)  	if err != nil {  		return fuse.ToStatus(err)  	} -	return fs.FileSystem.Chmod(cPath, mode, context) +	// 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) +	return fuse.ToStatus(err)  }  func (fs *FS) Chown(path string, uid uint32, gid uint32, context *fuse.Context) (code fuse.Status) { | 
