]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osdc/Objecter: fix dereference of NULL pg_pool_t
authorSage Weil <sage@inktank.com>
Sun, 1 Sep 2013 15:42:23 +0000 (08:42 -0700)
committerSage Weil <sage@inktank.com>
Sun, 1 Sep 2013 15:42:41 +0000 (08:42 -0700)
Make sure we don't dereference a NULL pointer.  Note that we check a
bit further down if the target pool does not exist and return the proper
error.

Bug was reliably reproduced by

 ./ceph_test_rados_api_watch_notify --gtest_filter=LibRadosWatchNotify.WatchNotifyTimeoutTestPP

Signed-off-by: Sage Weil <sage@inktank.com>
src/osdc/Objecter.cc

index 75292d13ac3ad14baa7ddc3a6994127e1a10816f..188c28d5e56b48837e09ebf8e681390b9ead3af6 100644 (file)
@@ -1329,10 +1329,13 @@ int Objecter::recalc_op_target(Op *op)
   bool is_write = op->flags & CEPH_OSD_FLAG_WRITE;
 
   op->target_oloc = op->base_oloc;
-  if (is_read && osdmap->get_pg_pool(op->base_oloc.pool)->has_read_tier())
-    op->target_oloc.pool = osdmap->get_pg_pool(op->base_oloc.pool)->read_tier;
-  if (is_write && osdmap->get_pg_pool(op->base_oloc.pool)->has_write_tier())
-    op->target_oloc.pool = osdmap->get_pg_pool(op->base_oloc.pool)->write_tier;
+  const pg_pool_t *pi = osdmap->get_pg_pool(op->base_oloc.pool);
+  if (pi) {
+    if (is_read && pi->has_read_tier())
+      op->target_oloc.pool = pi->read_tier;
+    if (is_write && pi->has_write_tier())
+      op->target_oloc.pool = pi->write_tier;
+  }
 
   if (op->precalc_pgid) {
     assert(op->oid.name.empty()); // make sure this is a listing op