From c40df505f0f526dfc3412f53d0005c0b540b9846 Mon Sep 17 00:00:00 2001 From: John Spray Date: Tue, 28 Apr 2015 18:40:57 +0100 Subject: [PATCH] librados: fix empty NObjectIterator crash on comparisons This would segfault if you did a NObjectIterator i; i == ... Fix comparisons by allowing pointer-wise comparisons for iterators with impl==NULL, and asserting in other methods that require a non-null ::impl Signed-off-by: John Spray --- src/librados/librados.cc | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/librados/librados.cc b/src/librados/librados.cc index 6e4ed5610915..5a86cdec4c05 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -695,23 +695,31 @@ librados::NObjectIterator& librados::NObjectIterator::operator=(const librados:: bool librados::NObjectIterator::operator==(const librados::NObjectIterator& rhs) const { - return *impl == *(rhs.impl); + if (impl && rhs.impl) { + return *impl == *(rhs.impl); + } else { + return impl == rhs.impl; + } } -bool librados::NObjectIterator::operator!=(const librados::NObjectIterator& rhs) const { - return !(*impl == *(rhs.impl)); +bool librados::NObjectIterator::operator!=(const librados::NObjectIterator& rhs) const +{ + return !(*this == rhs); } const librados::ListObject& librados::NObjectIterator::operator*() const { + assert(impl); return *(impl->get_listobjectp()); } const librados::ListObject* librados::NObjectIterator::operator->() const { + assert(impl); return impl->get_listobjectp(); } librados::NObjectIterator& librados::NObjectIterator::operator++() { + assert(impl); impl->get_next(); return *this; } @@ -725,16 +733,19 @@ librados::NObjectIterator librados::NObjectIterator::operator++(int) uint32_t librados::NObjectIterator::seek(uint32_t pos) { + assert(impl); return impl->seek(pos); } void librados::NObjectIterator::get_next() { + assert(impl); impl->get_next(); } uint32_t librados::NObjectIterator::get_pg_hash_position() const { + assert(impl); return impl->get_pg_hash_position(); } -- 2.47.3