From 2b41ddf343e8e314dc60fae0d5f4e007ce3857e4 Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Wed, 11 Nov 2020 11:29:12 -0800 Subject: [PATCH 1/2] test/libcephfs: test truncate on rdonly fd Fixes: https://tracker.ceph.com/issues/48202 Signed-off-by: Patrick Donnelly --- src/test/libcephfs/test.cc | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/test/libcephfs/test.cc b/src/test/libcephfs/test.cc index dc4e627eeee..ef43e108705 100644 --- a/src/test/libcephfs/test.cc +++ b/src/test/libcephfs/test.cc @@ -33,6 +33,7 @@ #include #endif +#include #include #include #include @@ -80,6 +81,30 @@ TEST(LibCephFS, OpenEmptyComponent) { ceph_shutdown(cmount); } +TEST(LibCephFS, OpenReadTruncate) { + struct ceph_mount_info *cmount; + ASSERT_EQ(0, ceph_create(&cmount, NULL)); + ASSERT_EQ(0, ceph_conf_read_file(cmount, NULL)); + ASSERT_EQ(0, ceph_conf_parse_env(cmount, NULL)); + ASSERT_EQ(0, ceph_mount(cmount, "/")); + + auto path = fmt::format("test_open_rdt_{}", getpid()); + int fd = ceph_open(cmount, path.c_str(), O_WRONLY|O_CREAT, 0666); + ASSERT_LE(0, fd); + + auto data = std::string("hello world"); + ASSERT_EQ(ceph_write(cmount, fd, data.c_str(), data.size(), 0), (int)data.size()); + ASSERT_EQ(0, ceph_close(cmount, fd)); + + fd = ceph_open(cmount, path.c_str(), O_RDONLY, 0); + ASSERT_LE(0, fd); + ASSERT_EQ(ceph_ftruncate(cmount, fd, 0), -EBADF); + ASSERT_EQ(ceph_ftruncate(cmount, fd, 1), -EBADF); + ASSERT_EQ(0, ceph_close(cmount, fd)); + + ceph_shutdown(cmount); +} + TEST(LibCephFS, OpenReadWrite) { struct ceph_mount_info *cmount; ASSERT_EQ(0, ceph_create(&cmount, NULL)); From 3bb209772eada4ba5010be521f7ecaae567598d0 Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Wed, 11 Nov 2020 11:37:09 -0800 Subject: [PATCH 2/2] client: check rdonly file handle on truncate Fixes: https://tracker.ceph.com/issues/48202 Signed-off-by: Patrick Donnelly --- src/client/Client.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/client/Client.cc b/src/client/Client.cc index 35dbd94058c..12cd6c741fb 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -10134,6 +10134,8 @@ int Client::ftruncate(int fd, loff_t length, const UserPerm& perms) if (f->flags & O_PATH) return -EBADF; #endif + if ((f->mode & CEPH_FILE_MODE_WR) == 0) + return -EBADF; struct stat attr; attr.st_size = length; return _setattr(f->inode, &attr, CEPH_SETATTR_SIZE, perms);