From c190dcdbbd623b76a2be7c41240fcc9ede35bac8 Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Sat, 7 Feb 2026 21:19:14 +0100 Subject: darwin: syscallcompat: Openat: use O_SYMLINK Also add tests that opening a symlink (using unix.O_PATH | unix.O_NOFOLLOW) works. https://github.com/rfjakob/gocryptfs/issues/993 --- tests/matrix/symlink_darwin_test.go | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 tests/matrix/symlink_darwin_test.go (limited to 'tests/matrix/symlink_darwin_test.go') diff --git a/tests/matrix/symlink_darwin_test.go b/tests/matrix/symlink_darwin_test.go new file mode 100644 index 0000000..b8284a5 --- /dev/null +++ b/tests/matrix/symlink_darwin_test.go @@ -0,0 +1,38 @@ +package matrix + +import ( + "os" + "testing" + + "golang.org/x/sys/unix" + + "github.com/rfjakob/gocryptfs/v2/tests/test_helpers" +) + +// Darwin has O_SYMLINK which is more powerful than O_NOFOLLOW +func TestOpenSymlinkDarwin(t *testing.T) { + path := test_helpers.DefaultPlainDir + "/TestOpenSymlink" + target := "/target/does/not/exist" + err := os.Symlink(target, path) + if err != nil { + t.Fatal(err) + } + fd, err := unix.Open(path, unix.O_RDONLY|unix.O_SYMLINK, 0) + if err != nil { + t.Fatal(err) + } + defer unix.Close(fd) + var st unix.Stat_t + if err := unix.Fstat(fd, &st); err != nil { + t.Fatal(err) + } + if st.Size != int64(len(target)) { + t.Errorf("wrong size: have=%d want=%d", st.Size, len(target)) + } + if err := unix.Unlink(path); err != nil { + t.Fatal(err) + } + if err := unix.Fstat(fd, &st); err != nil { + t.Error(err) + } +} -- cgit v1.2.3