From: Ilya Dryomov Date: Sun, 12 May 2024 10:35:46 +0000 (+0200) Subject: osdc/Striper: relax assert in assemble_result() for raw buffers X-Git-Tag: v17.2.8~295^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1e633af5eea4203ea248b883363468406cd967d8;p=ceph.git osdc/Striper: relax assert in assemble_result() for raw buffers The previous commit uncovered an old bug, introduced in commit 9867804c2058 ("Striper: Add function 'assemble_result(CephContext *cct, char *buffer, size_t len)' in StripedReadResult."). The buffer is allowed to be NULL when assemble_result() is called -- it becomes a problem only if some data was read. Strengthen ZeroLengthRead and ZeroLengthWrite tests to cover both a bogus pointer and a NULL pointer for buffer. Signed-off-by: Ilya Dryomov (cherry picked from commit e6773a92f774b0f2748f2565ca4f53b6ace9fbdf) --- diff --git a/src/osdc/Striper.cc b/src/osdc/Striper.cc index 6f162e901fe..69bdda06f84 100644 --- a/src/osdc/Striper.cc +++ b/src/osdc/Striper.cc @@ -485,13 +485,14 @@ void Striper::StripedReadResult::assemble_result(CephContext *cct, void Striper::StripedReadResult::assemble_result(CephContext *cct, char *buffer, size_t length) { - - ceph_assert(buffer && length == total_intended_len); + ceph_assert(length == total_intended_len); map >::reverse_iterator p = partial.rbegin(); if (p == partial.rend()) return; + ceph_assert(buffer); + uint64_t curr = length; uint64_t end = p->first + p->second.second; while (p != partial.rend()) { diff --git a/src/test/librbd/test_librbd.cc b/src/test/librbd/test_librbd.cc index f4b4b3907bf..ca47805e506 100644 --- a/src/test/librbd/test_librbd.cc +++ b/src/test/librbd/test_librbd.cc @@ -7290,8 +7290,12 @@ TEST_F(TestLibRBD, ZeroLengthWrite) ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order)); ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL)); - char read_data[1]; + const char data[] = "blah"; + ASSERT_EQ(0, rbd_write(image, 0, 0, data)); + ASSERT_EQ(0, rbd_write(image, 0, 0, (char*)0x123)); ASSERT_EQ(0, rbd_write(image, 0, 0, NULL)); + + char read_data[1]; ASSERT_EQ(1, rbd_read(image, 0, 1, read_data)); ASSERT_EQ('\0', read_data[0]); @@ -7343,6 +7347,8 @@ TEST_F(TestLibRBD, ZeroLengthRead) char read_data[1]; ASSERT_EQ(0, rbd_read(image, 0, 0, read_data)); + ASSERT_EQ(0, rbd_read(image, 0, 0, (char*)0x123)); + ASSERT_EQ(0, rbd_read(image, 0, 0, NULL)); ASSERT_EQ(0, rbd_close(image));