diff options
| -rw-r--r-- | internal/fusefrontend/fs.go | 4 | ||||
| -rw-r--r-- | tests/integration_tests/main_test.go | 16 | 
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) +	} +} | 
