12308: Clarify chmod behavior.
authorTom Clegg <tom@tomclegg.ca>
Wed, 12 Feb 2020 17:02:39 +0000 (12:02 -0500)
committerTom Clegg <tom@tomclegg.ca>
Wed, 12 Feb 2020 17:02:39 +0000 (12:02 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@tomclegg.ca>

lib/mount/fs.go

index c18c83d86bd88da246c46ec5ed28f363dd29c18c..c008b96af664ffa605592a1f61e14e30eb4677d3 100644 (file)
@@ -252,11 +252,18 @@ func (fs *keepFS) Chmod(path string, mode uint32) (errc int) {
        }
        if fi, err := fs.root.Stat(path); err != nil {
                return fs.errCode(err)
-       } else if mode & ^uint32(fuse.S_IFREG|fuse.S_IFDIR|0777) != 0 || (fi.Mode()&os.ModeDir != 0) != (mode&fuse.S_IFDIR != 0) {
+       } else if mode & ^uint32(fuse.S_IFREG|fuse.S_IFDIR|0777) != 0 {
+               // Refuse to set mode bits other than
+               // regfile/dir/perms
+               return -fuse.ENOSYS
+       } else if (fi.Mode()&os.ModeDir != 0) != (mode&fuse.S_IFDIR != 0) {
+               // Refuse to transform a regular file to a dir, or
+               // vice versa
                return -fuse.ENOSYS
-       } else {
-               return 0
        }
+       // As long as the change isn't nonsense, chmod is a no-op,
+       // because we don't save permission bits.
+       return 0
 }
 
 func (fs *keepFS) fillStat(stat *fuse.Stat_t, fi os.FileInfo) {