From: John Spray Date: Tue, 28 Apr 2015 17:40:57 +0000 (+0100) Subject: librados: fix empty NObjectIterator crash on comparisons X-Git-Tag: v9.1.0~436^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F4860%2Fhead;p=ceph.git 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 --- 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(); }