From: Sage Weil Date: Sat, 11 Feb 2012 17:49:42 +0000 (-0800) Subject: mon: validate osmdap input X-Git-Tag: v0.42~41 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7eff37be494714febed4e6724237c03722b4e8c5;p=ceph.git mon: validate osmdap input And clean up some error return paths while we're here. Fixes: #1493 Signed-off-by: Sage Weil --- diff --git a/src/ceph_mon.cc b/src/ceph_mon.cc index e2fb06ea3fb5..4061395e30db 100644 --- a/src/ceph_mon.cc +++ b/src/ceph_mon.cc @@ -193,7 +193,11 @@ int main(int argc, const char **argv) // go MonitorStore store(g_conf->mon_data); Monitor mon(g_ceph_context, g_conf->name.get_id(), &store, 0, &monmap); - mon.mkfs(osdmapbl); + int r = mon.mkfs(osdmapbl); + if (r < 0) { + cerr << argv[0] << ": error creating monfs: " << cpp_strerror(r) << std::endl; + exit(1); + } cout << argv[0] << ": created monfs at " << g_conf->mon_data << " for " << g_conf->name << std::endl; return 0; diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 2f4af66dfa9e..a690c6ba5e21 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -1659,21 +1659,16 @@ int Monitor::mkfs(bufferlist& osdmapbl) // create it int err = store->mkfs(); if (err) { - dout(0) << TEXT_RED << "** ERROR: store->mkfs failed with error code " - << err << ". Aborting." << TEXT_NORMAL << dendl; - exit(1); + derr << "store->mkfs failed with: " << cpp_strerror(err) << dendl; + return err; } bufferlist magicbl; magicbl.append(CEPH_MON_ONDISK_MAGIC); magicbl.append("\n"); int r = store->put_bl_ss(magicbl, "magic", 0); - if (r < 0) { - dout(0) << TEXT_RED << "** ERROR: initializing ceph-mon failed: couldn't " - << "initialize the monitor state machine: " << cpp_strerror(r) - << TEXT_NORMAL << dendl; - exit(1); - } + if (r < 0) + return r; bufferlist features; CompatSet mon_features = get_ceph_mon_feature_compat_set(); @@ -1686,8 +1681,18 @@ int Monitor::mkfs(bufferlist& osdmapbl) monmap->set_epoch(0); // must be 0 to avoid confusing first MonmapMonitor::update_from_paxos() store->put_bl_ss(monmapbl, "mkfs", "monmap"); - if (osdmapbl.length()) + if (osdmapbl.length()) { + // make sure it's a valid osdmap + try { + OSDMap om; + om.decode(osdmapbl); + } + catch (buffer::error& e) { + derr << "error decoding provided osdmap: " << e.what() << dendl; + return -EINVAL; + } store->put_bl_ss(osdmapbl, "mkfs", "osdmap"); + } KeyRing keyring; r = keyring.load(g_ceph_context, g_conf->keyring);