From d20bf07eca9583447fb6fc98b09f321979bac8ee Mon Sep 17 00:00:00 2001 From: Loic Dachary Date: Sun, 17 Feb 2013 09:41:09 +0100 Subject: [PATCH] buffer::ptr::cmp only compares up to the smallest length When running bufferptr a("A", 1); bufferptr ab("AB", 2); a.cmp(ab); it returned zero because. cmp only compared up to the length of the smallest buffer and returned if they are identical. The function is modified to compare the length of the buffers instead of returning. http://tracker.ceph.com/issues/4170 refs #4170 Signed-off-by: Loic Dachary --- src/common/buffer.cc | 2 +- src/test/bufferlist.cc | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/common/buffer.cc b/src/common/buffer.cc index e10d6c9038c2f..df50cfccc4220 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -371,7 +371,7 @@ bool buffer_track_alloc = get_env_bool("CEPH_BUFFER_TRACK"); int l = _len < o._len ? _len : o._len; if (l) { int r = memcmp(c_str(), o.c_str(), l); - if (!r) + if (r) return r; } if (_len < o._len) diff --git a/src/test/bufferlist.cc b/src/test/bufferlist.cc index 71c2e793c8260..7abced105548f 100644 --- a/src/test/bufferlist.cc +++ b/src/test/bufferlist.cc @@ -9,6 +9,23 @@ #define MAX_TEST 1000000 +TEST(BufferPtr, cmp) { + bufferptr empty; + bufferptr a("A", 1); + bufferptr ab("AB", 2); + bufferptr af("AF", 2); + bufferptr acc("ACC", 3); + EXPECT_GE(-1, empty.cmp(a)); + EXPECT_LE(1, a.cmp(empty)); + EXPECT_GE(-1, a.cmp(ab)); + EXPECT_LE(1, ab.cmp(a)); + EXPECT_EQ(0, ab.cmp(ab)); + EXPECT_GE(-1, ab.cmp(af)); + EXPECT_LE(1, af.cmp(ab)); + EXPECT_GE(-1, acc.cmp(af)); + EXPECT_LE(1, af.cmp(acc)); +} + TEST(BufferList, zero) { // // void zero() -- 2.39.5