]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: fix empty NObjectIterator crash on comparisons 4860/head
authorJohn Spray <john.spray@redhat.com>
Tue, 28 Apr 2015 17:40:57 +0000 (18:40 +0100)
committerJohn Spray <john.spray@redhat.com>
Wed, 5 Aug 2015 13:03:07 +0000 (14:03 +0100)
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 <john.spray@redhat.com>
src/librados/librados.cc

index 6e4ed56109154058407d76ed056044fea05a4150..5a86cdec4c050c0573e8cace65aec40922f93d7d 100644 (file)
@@ -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();
 }