]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
buffer: add a test for iterator::copy(huge_chunk, dest) 9395/head
authorKefu Chai <kchai@redhat.com>
Tue, 7 Jun 2016 03:20:22 +0000 (11:20 +0800)
committerKefu Chai <kchai@redhat.com>
Tue, 7 Jun 2016 03:23:28 +0000 (11:23 +0800)
Fixes: http://tracker.ceph.com/issues/16010
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/common/buffer.cc
src/include/buffer.h
src/test/bufferlist.cc

index 19b4cd2ef7c6d4896d83401fc42528bf1ce544ef..0d8bcf098d6d38f05680e6f64b007c6b3ec1be7c 100644 (file)
@@ -752,6 +752,20 @@ static simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZER;
     return new raw_unshareable(len);
   }
 
+  class dummy_raw : public buffer::raw {
+  public:
+    dummy_raw()
+      : raw(UINT_MAX)
+    {}
+    virtual raw* clone_empty() override {
+      return new dummy_raw();
+    }
+  };
+
+  buffer::raw* buffer::create_dummy() {
+    return new dummy_raw();
+  }
+
   buffer::ptr::ptr(raw *r) : _raw(r), _off(0), _len(r->len)   // no lock needed; this is an unref raw.
   {
     r->nref.inc();
index 49fd999ee6dfef100215606972a359c661d78dee..95889be990ff6249810ed580544944ce2cdb5e2b 100644 (file)
@@ -151,6 +151,7 @@ namespace buffer CEPH_BUFFER_API {
   raw* create_page_aligned(unsigned len);
   raw* create_zero_copy(unsigned len, int fd, int64_t *offset);
   raw* create_unshareable(unsigned len);
+  raw* create_dummy();
 
 #if defined(HAVE_XIO)
   raw* create_msg(unsigned len, char *buf, XioDispatchHook *m_hook);
index 7b1f9a2dca9a4d06c759b36933f5c4b3230df138..e67760f35066e51012336edf4acc7633edec59b2 100644 (file)
@@ -1286,6 +1286,21 @@ TEST(BufferListIterator, copy) {
   }
 }
 
+TEST(BufferListIterator, copy_huge) {
+  constexpr unsigned len = 2268888894U;
+  static_assert(int(len) < 0,
+               "should be a number underflows when being casted to int.");
+  bufferptr ptr(buffer::create_dummy());
+  ptr.set_length(len);
+
+  bufferlist src, dest;
+  src.append(ptr);
+  auto bp = src.begin();
+  bp.copy(len, dest);
+  // contents_equal() is not for this test
+  EXPECT_EQ(len, dest.length());
+}
+
 TEST(BufferListIterator, copy_in) {
   bufferlist bl;
   const char *existing = "XXX";