From: Kefu Chai Date: Tue, 7 Jun 2016 03:20:22 +0000 (+0800) Subject: buffer: add a test for iterator::copy(huge_chunk, dest) X-Git-Tag: v11.0.0~224^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3caafc44765d331da9d8e1d52e03c6f2562848ae;p=ceph.git buffer: add a test for iterator::copy(huge_chunk, dest) Fixes: http://tracker.ceph.com/issues/16010 Signed-off-by: Kefu Chai --- diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 19b4cd2ef7c6..0d8bcf098d6d 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -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(); diff --git a/src/include/buffer.h b/src/include/buffer.h index 49fd999ee6df..95889be990ff 100644 --- a/src/include/buffer.h +++ b/src/include/buffer.h @@ -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); diff --git a/src/test/bufferlist.cc b/src/test/bufferlist.cc index 7b1f9a2dca9a..e67760f35066 100644 --- a/src/test/bufferlist.cc +++ b/src/test/bufferlist.cc @@ -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";