aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/fusefrontend/fs.go4
-rw-r--r--tests/integration_tests/main_test.go16
2 files changed, 18 insertions, 2 deletions
diff --git a/internal/fusefrontend/fs.go b/internal/fusefrontend/fs.go
index 988a41a..c216c86 100644
--- a/internal/fusefrontend/fs.go
+++ b/internal/fusefrontend/fs.go
@@ -165,11 +165,11 @@ func (fs *FS) Chown(path string, uid uint32, gid uint32, context *fuse.Context)
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.Chown(cPath, uid, gid, context)
+ return fuse.ToStatus(os.Lchown(cPath, int(uid), int(gid)))
}
func (fs *FS) Mknod(path string, mode uint32, dev uint32, context *fuse.Context) (code fuse.Status) {
diff --git a/tests/integration_tests/main_test.go b/tests/integration_tests/main_test.go
index b6cb8ca..17f9d9d 100644
--- a/tests/integration_tests/main_test.go
+++ b/tests/integration_tests/main_test.go
@@ -437,3 +437,19 @@ func TestLongNames(t *testing.T) {
t.Errorf("Leftover files, cnt1=%d cnt2=%d", cnt1, cnt2)
}
}
+
+func TestLchown(t *testing.T) {
+ name := test_helpers.DefaultPlainDir + "symlink"
+ err := os.Symlink("/target/does/not/exist", name)
+ if err != nil {
+ t.Fatal(err)
+ }
+ err = os.Chown(name, os.Getuid(), os.Getgid())
+ if err == nil {
+ t.Error("Chown on dangling symlink should fail")
+ }
+ err = os.Lchown(name, os.Getuid(), os.Getgid())
+ if err != nil {
+ t.Error(err)
+ }
+}