From 5055f39bd534b1f13257f95ffdc28575b9b2e3ed Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Sat, 5 Jan 2019 04:33:50 +0100 Subject: fusefrontend: Allow to set/remove xattr on directory without read permission. Setting/removing extended attributes on directories was partially fixed with commit eff35e60b63331e3e10f921792baa10b236a721d. However, on most file systems it is also possible to do these operations without read access (see tests). Since we cannot open a write-access fd to a directory, we have to use the /proc/self/fd trick (already used for ListXAttr) for the other operations aswell. For simplicity, let's separate the Linux and Darwin code again (basically revert commit f320b76fd189a363a34bffe981aa67ab97df3362), and always use the /proc/self/fd trick on Linux. On Darwin we use the best-effort approach with openBackingFile() as a fallback. More discussion about the available options is available in https://github.com/rfjakob/gocryptfs/issues/308. --- tests/xattr/xattr_integration_test.go | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (limited to 'tests/xattr') diff --git a/tests/xattr/xattr_integration_test.go b/tests/xattr/xattr_integration_test.go index f182fd9..29c3e84 100644 --- a/tests/xattr/xattr_integration_test.go +++ b/tests/xattr/xattr_integration_test.go @@ -129,7 +129,7 @@ func TestSetGetRmDir(t *testing.T) { fn := test_helpers.DefaultPlainDir + "/TestSetGetRmDir" err := syscall.Mkdir(fn, 0700) if err != nil { - t.Fatalf("creating fifo failed: %v", err) + t.Fatalf("creating directory failed: %v", err) } setGetRmList(fn) } @@ -316,3 +316,31 @@ func TestSet0200File(t *testing.T) { t.Error(err) } } + +// Listing xattrs should work even when we don't have read access +func TestList0000Dir(t *testing.T) { + fn := test_helpers.DefaultPlainDir + "/TestList0000Dir" + err := syscall.Mkdir(fn, 0000) + if err != nil { + t.Fatalf("creating directory failed: %v", err) + } + _, err = xattr.LList(fn) + os.Chmod(fn, 0700) + if err != nil { + t.Error(err) + } +} + +// Setting xattrs should work even when we don't have read access +func TestSet0200Dir(t *testing.T) { + fn := test_helpers.DefaultPlainDir + "/TestSet0200Dir" + err := syscall.Mkdir(fn, 0200) + if err != nil { + t.Fatalf("creating directory failed: %v", err) + } + err = xattr.LSet(fn, "user.foo", []byte("bar")) + os.Chmod(fn, 0700) + if err != nil { + t.Error(err) + } +} -- cgit v1.2.3