summaryrefslogtreecommitdiffstats
path: root/src/test/libcephfs/test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/libcephfs/test.cc')
-rw-r--r--src/test/libcephfs/test.cc19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/test/libcephfs/test.cc b/src/test/libcephfs/test.cc
index f2c87168633..6f10d2bbd4e 100644
--- a/src/test/libcephfs/test.cc
+++ b/src/test/libcephfs/test.cc
@@ -976,6 +976,13 @@ TEST(LibCephFS, Symlinks) {
fd = ceph_open(cmount, test_symlink, O_NOFOLLOW, 0);
ASSERT_EQ(fd, -CEPHFS_ELOOP);
+#if defined(__linux__) && defined(O_PATH)
+ // test the O_NOFOLLOW with O_PATH case
+ fd = ceph_open(cmount, test_symlink, O_PATH|O_NOFOLLOW, 0);
+ ASSERT_GT(fd, 0);
+ ceph_close(cmount, fd);
+#endif /* __linux */
+
// stat the original file
struct ceph_statx stx_orig;
ASSERT_EQ(ceph_statx(cmount, test_file, &stx_orig, CEPH_STATX_ALL_STATS, 0), 0);
@@ -3012,6 +3019,18 @@ TEST(LibCephFS, Readlinkat) {
ASSERT_EQ(0, memcmp(target, rel_file_path, target_len));
ASSERT_EQ(0, ceph_close(cmount, fd));
+#if defined(__linux__) && defined(O_PATH)
+ // test readlinkat with empty pathname relative to O_PATH|O_NOFOLLOW fd
+ fd = ceph_open(cmount, link_path, O_PATH | O_NOFOLLOW, 0);
+ ASSERT_LE(0, fd);
+ size_t link_target_len = strlen(rel_file_path);
+ char link_target[link_target_len+1];
+ ASSERT_EQ(link_target_len, ceph_readlinkat(cmount, fd, "", link_target, link_target_len));
+ link_target[link_target_len] = '\0';
+ ASSERT_EQ(0, memcmp(link_target, rel_file_path, link_target_len));
+ ASSERT_EQ(0, ceph_close(cmount, fd));
+#endif /* __linux */
+
ASSERT_EQ(0, ceph_unlink(cmount, link_path));
ASSERT_EQ(0, ceph_unlink(cmount, file_path));
ASSERT_EQ(0, ceph_rmdir(cmount, dir_path));