From 2f22547063109c37054674ba485bd7e2401d1a21 Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Sun, 12 May 2024 12:35:46 +0200 Subject: [PATCH] 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) --- src/osdc/Striper.cc | 5 +++-- src/test/librbd/test_librbd.cc | 8 +++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/osdc/Striper.cc b/src/osdc/Striper.cc index 6f162e901fe7f..69bdda06f84cf 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 8ad5c5aa5b15a..6db7f94e6de1a 100644 --- a/src/test/librbd/test_librbd.cc +++ b/src/test/librbd/test_librbd.cc @@ -8683,8 +8683,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]); @@ -8736,6 +8740,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)); -- 2.39.5