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();
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);
}
}
+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";