]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: validate osmdap input
authorSage Weil <sage.weil@dreamhost.com>
Sat, 11 Feb 2012 17:49:42 +0000 (09:49 -0800)
committerSage Weil <sage.weil@dreamhost.com>
Sat, 11 Feb 2012 17:49:42 +0000 (09:49 -0800)
And clean up some error return paths while we're here.

Fixes: #1493
Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/ceph_mon.cc
src/mon/Monitor.cc

index e2fb06ea3fb52b6b84e0b56ab7e30545d3a5f0b6..4061395e30dbbfca05ce965fa78d9717729fb44a 100644 (file)
@@ -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;
index 2f4af66dfa9eb1dbb87b5a09ef2d3ae3a840e906..a690c6ba5e21516febd123d5e2e87af43650b61e 100644 (file)
@@ -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);