summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-09-01 08:42:23 -0700
committerSage Weil <sage@inktank.com>2013-09-01 08:42:41 -0700
commit1c5e58a85ef7f26b2c617ecb6c08de5632bb0fe3 (patch)
tree890181b24a7478efc13bdfb47de881df9174f7ee
parenta200e184b15a03a4ca382e94caf01efb41cb9db7 (diff)
downloadceph-1c5e58a85ef7f26b2c617ecb6c08de5632bb0fe3.tar.gz
osdc/Objecter: fix dereference of NULL pg_pool_t
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>
-rw-r--r--src/osdc/Objecter.cc11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc
index 75292d13ac3..188c28d5e56 100644
--- a/src/osdc/Objecter.cc
+++ b/src/osdc/Objecter.cc
@@ -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