diff options
author | Sage Weil <sage@inktank.com> | 2013-09-01 08:42:23 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-09-01 08:42:41 -0700 |
commit | 1c5e58a85ef7f26b2c617ecb6c08de5632bb0fe3 (patch) | |
tree | 890181b24a7478efc13bdfb47de881df9174f7ee | |
parent | a200e184b15a03a4ca382e94caf01efb41cb9db7 (diff) | |
download | ceph-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.cc | 11 |
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 |