From: John Spray Date: Thu, 19 Jan 2017 08:15:27 +0000 (+0100) Subject: Merge pull request #12550 from stiopaa1/B9935_segfaultInRmDir X-Git-Tag: v12.0.0~140 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=36874c8d0ca827f4ed9fda545dc5904bc1e2fd71;p=ceph.git Merge pull request #12550 from stiopaa1/B9935_segfaultInRmDir client/Client.cc: prevent segfaulting Reviewed-by: John Spray --- 36874c8d0ca827f4ed9fda545dc5904bc1e2fd71 diff --cc src/test/libcephfs/test.cc index 927db4eb6ae8,baea14fcf358..e2864f8e964c --- a/src/test/libcephfs/test.cc +++ b/src/test/libcephfs/test.cc @@@ -1766,10 -1733,47 +1766,48 @@@ TEST(LibCephFS, ClearSetuid) stx.stx_uid++; stx.stx_gid++; ASSERT_EQ(ceph_ll_setattr(cmount, in, &stx, CEPH_SETATTR_UID|CEPH_SETATTR_GID, rootcred), 0); - ASSERT_EQ(ceph_ll_getattr(cmount, in, &stx, CEPH_STATX_MODE, 0, ceph_mount_perms(cmount)), 0); + ASSERT_EQ(ceph_ll_getattr(cmount, in, &stx, CEPH_STATX_MODE, 0, usercred), 0); ASSERT_TRUE(stx.stx_mask & CEPH_STATX_MODE); - ASSERT_FALSE(stx.stx_mode & (S_ISUID|S_ISGID)); + ASSERT_EQ(stx.stx_mode & (mode_t)ALLPERMS, after_mode); + ASSERT_EQ(ceph_ll_close(cmount, fh), 0); ceph_shutdown(cmount); } + + TEST(LibCephFS, OperationsOnRoot) + { + struct ceph_mount_info *cmount; + ASSERT_EQ(ceph_create(&cmount, NULL), 0); + ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); + ASSERT_EQ(0, ceph_conf_parse_env(cmount, NULL)); + ASSERT_EQ(ceph_mount(cmount, "/"), 0); + + char dirname[32]; + sprintf(dirname, "/somedir%x", getpid()); + + ASSERT_EQ(ceph_mkdir(cmount, dirname, 0755), 0); + + ASSERT_EQ(ceph_rmdir(cmount, "/"), -EBUSY); + + ASSERT_EQ(ceph_link(cmount, "/", "/"), -EEXIST); + ASSERT_EQ(ceph_link(cmount, dirname, "/"), -EEXIST); + ASSERT_EQ(ceph_link(cmount, "nonExisitingDir", "/"), -ENOENT); + + ASSERT_EQ(ceph_unlink(cmount, "/"), -EISDIR); + + ASSERT_EQ(ceph_rename(cmount, "/", "/"), -EBUSY); + ASSERT_EQ(ceph_rename(cmount, dirname, "/"), -EBUSY); + ASSERT_EQ(ceph_rename(cmount, "nonExistingDir", "/"), -EBUSY); + ASSERT_EQ(ceph_rename(cmount, "/", dirname), -EBUSY); + ASSERT_EQ(ceph_rename(cmount, "/", "nonExistingDir"), -EBUSY); + + ASSERT_EQ(ceph_mkdir(cmount, "/", 0777), -EEXIST); + + ASSERT_EQ(ceph_mknod(cmount, "/", 0, 0), -EEXIST); + + ASSERT_EQ(ceph_symlink(cmount, "/", "/"), -EEXIST); + ASSERT_EQ(ceph_symlink(cmount, dirname, "/"), -EEXIST); + ASSERT_EQ(ceph_symlink(cmount, "nonExistingDir", "/"), -EEXIST); + + ceph_shutdown(cmount); + }