From dabc61110a5773262614fc77d3653674aac421f7 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Thu, 9 Jul 2015 13:32:03 +0800 Subject: [PATCH 1/2] UnittestBuffer: Add bufferlist zero test case Signed-off-by: Haomai Wang (cherry picked from commit 577acf665948e531e50d36f5780ea19351a5bf65) --- src/test/bufferlist.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/bufferlist.cc b/src/test/bufferlist.cc index 787ce7e4297741..fdc7014332f530 100644 --- a/src/test/bufferlist.cc +++ b/src/test/bufferlist.cc @@ -2221,6 +2221,17 @@ TEST(BufferList, zero) { bl.zero((unsigned)3, (unsigned)3); EXPECT_EQ(0, ::memcmp("ABC\0\0\0GHIKLM", bl.c_str(), 9)); } + { + bufferlist bl; + bufferptr ptr1(4); + bufferptr ptr2(4); + memset(ptr1.c_str(), 'a', 4); + memset(ptr2.c_str(), 'b', 4); + bl.append(ptr1); + bl.append(ptr2); + bl.zero((unsigned)2, (unsigned)4); + EXPECT_EQ(0, ::memcmp("aa\0\0\0\0bb", bl.c_str(), 8)); + } } TEST(BufferList, EmptyAppend) { From 0fde3a2465e156ebf9a5cdc6adc45d66d6d647fc Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Thu, 9 Jul 2015 13:42:42 +0800 Subject: [PATCH 2/2] buffer: Fix bufferlist::zero bug with special case Fixes: #12252 Signed-off-by: Haomai Wang (cherry picked from commit 43f583d160ccaf879eaf0f3020e77860cf8d1df0) --- src/common/buffer.cc | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 88656e836bd29f..2a91ec34bf84d3 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -1165,12 +1165,23 @@ static simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZER; it != _buffers.end(); ++it) { if (p + it->length() > o) { - if (p >= o && p+it->length() <= o+l) - it->zero(); // all - else if (p >= o) - it->zero(0, o+l-p); // head - else - it->zero(o-p, it->length()-(o-p)); // tail + if (p >= o && p+it->length() <= o+l) { + // 'o'------------- l -----------| + // 'p'-- it->length() --| + it->zero(); + } else if (p >= o) { + // 'o'------------- l -----------| + // 'p'------- it->length() -------| + it->zero(0, o+l-p); + } else if (p + it->length() <= o+l) { + // 'o'------------- l -----------| + // 'p'------- it->length() -------| + it->zero(o-p, it->length()-(o-p)); + } else { + // 'o'----------- l -----------| + // 'p'---------- it->length() ----------| + it->zero(o-p, l); + } } p += it->length(); if (o+l <= p)