From: Josh Durgin Date: Wed, 26 Feb 2014 21:00:33 +0000 (-0800) Subject: librados: fix ObjectIterator::operator= for the end iterator X-Git-Tag: v0.78~107^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bfad17bfa973a287346acde06174af01665ad596;p=ceph.git librados: fix ObjectIterator::operator= for the end iterator We can't set a shared_ptr to NULL, we need to reset it instead. Add another test for various permutations of this. Fixes: #7538 Signed-off-by: Josh Durgin --- diff --git a/src/librados/librados.cc b/src/librados/librados.cc index 040bf251d13e..581b120ca31d 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -489,6 +489,10 @@ librados::ObjectIterator& librados::ObjectIterator::operator=(const librados::Ob { if (&rhs == this) return *this; + if (rhs.ctx.get() == NULL) { + ctx.reset(); + return *this; + } Objecter::ListContext *list_ctx = new Objecter::ListContext(*rhs.ctx->lc); ctx.reset(new ObjListCtx(rhs.ctx->ctx, list_ctx)); cur_obj = rhs.cur_obj; diff --git a/src/test/librados/list.cc b/src/test/librados/list.cc index 69c006e562e6..c530b60b6e06 100644 --- a/src/test/librados/list.cc +++ b/src/test/librados/list.cc @@ -105,6 +105,31 @@ TEST_F(LibRadosListPP, ListObjectsCopyIterPP) { ASSERT_TRUE(iter3 == ioctx.objects_end()); } +TEST_F(LibRadosListPP, ListObjectsEndIter) { + char buf[128]; + memset(buf, 0xcc, sizeof(buf)); + bufferlist bl1; + bl1.append(buf, sizeof(buf)); + ASSERT_EQ((int)sizeof(buf), ioctx.write("foo", bl1, sizeof(buf), 0)); + + ObjectIterator iter(ioctx.objects_begin()); + ObjectIterator iter_end(ioctx.objects_end()); + ObjectIterator iter_end2 = ioctx.objects_end(); + ASSERT_TRUE(iter_end == iter_end2); + ASSERT_TRUE(iter_end == ioctx.objects_end()); + ASSERT_TRUE(iter_end2 == ioctx.objects_end()); + + ASSERT_EQ(iter->first, "foo"); + ++iter; + ASSERT_TRUE(iter == ioctx.objects_end()); + ASSERT_TRUE(iter == iter_end); + ASSERT_TRUE(iter == iter_end2); + ObjectIterator iter2 = iter; + ASSERT_TRUE(iter2 == ioctx.objects_end()); + ASSERT_TRUE(iter2 == iter_end); + ASSERT_TRUE(iter2 == iter_end2); +} + static void check_list(std::set& myset, rados_list_ctx_t& ctx) { const char *entry;