From 74138288d7f5e1b182bf23746d678aa601d2ec9d Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 30 Apr 2012 13:36:37 -0700 Subject: [PATCH] osdmap: do no dereference NULL entity_addr_t pointer in addr accessors These may be NULL if we expand the addr vectors but haven't ever stored an address yet. Check for NULL and return a reference to a blank entity_addr_t as needed. Signed-off-by: Sage Weil --- src/osd/OSDMap.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index c7d1aba6729ba..f76f22d6db320 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -160,6 +160,7 @@ private: vector > client_addr; vector > cluster_addr; vector > hb_addr; + entity_addr_t blank; }; std::tr1::shared_ptr osd_addrs; @@ -300,17 +301,17 @@ private: } const entity_addr_t &get_addr(int osd) const { assert(exists(osd)); - return *osd_addrs->client_addr[osd]; + return osd_addrs->client_addr[osd] ? *osd_addrs->client_addr[osd] : osd_addrs->blank; } const entity_addr_t &get_cluster_addr(int osd) const { assert(exists(osd)); - if (*osd_addrs->cluster_addr[osd] == entity_addr_t()) + if (!osd_addrs->cluster_addr[osd] || *osd_addrs->cluster_addr[osd] == entity_addr_t()) return get_addr(osd); return *osd_addrs->cluster_addr[osd]; } const entity_addr_t &get_hb_addr(int osd) const { assert(exists(osd)); - return *osd_addrs->hb_addr[osd]; + return osd_addrs->hb_addr[osd] ? *osd_addrs->hb_addr[osd] : osd_addrs->blank; } entity_inst_t get_inst(int osd) const { assert(is_up(osd)); -- 2.39.5