]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osdc/Striper: relax assert in assemble_result() for raw buffers 57570/head
authorIlya Dryomov <idryomov@gmail.com>
Sun, 12 May 2024 10:35:46 +0000 (12:35 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 20 May 2024 13:14:47 +0000 (15:14 +0200)
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 <idryomov@gmail.com>
(cherry picked from commit e6773a92f774b0f2748f2565ca4f53b6ace9fbdf)

src/osdc/Striper.cc
src/test/librbd/test_librbd.cc

index 6f162e901fe7feb90b4e6d4ecfd95bc908bc3f4d..69bdda06f84cf5937239930df5595abaf79db828 100644 (file)
@@ -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<uint64_t,pair<bufferlist,uint64_t> >::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()) {
index 8ad5c5aa5b15ab1be6556c868e860fcb53f68699..6db7f94e6de1ab86be3c1e083715512e0bef99ba 100644 (file)
@@ -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));