From 5133dd60e272d3fcbaacd5662a708ee4cf0db46d Mon Sep 17 00:00:00 2001 From: Joao Eduardo Luis Date: Fri, 22 Nov 2013 02:17:16 +0000 Subject: [PATCH] mon: OSDMonitor: don't crash if formatter is invalid during osd crush dump Code would assume a formatter would always be defined. If a 'plain' formatter or even an invalid formatter were to be supplied, the monitor would crash and burn in poor style. Fixes: 6820 Backport: emperor Signed-off-by: Joao Eduardo Luis (cherry picked from commit 49d2fb71422fe4edfe5795c001104fb5bc8c98c3) --- src/mon/OSDMonitor.cc | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index f6794066f75e6..97a193ca623ac 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -2340,7 +2340,10 @@ bool OSDMonitor::preprocess_command(MMonCommand *m) prefix == "osd crush rule ls") { string format; cmd_getval(g_ceph_context, cmdmap, "format", format, string("json-pretty")); - boost::scoped_ptr f(new_formatter(format)); + Formatter *fp = new_formatter(format); + if (!fp) + fp = new_formatter("json-pretty"); + boost::scoped_ptr f(fp); f->open_array_section("rules"); osdmap.crush->list_rules(f.get()); f->close_section(); @@ -2351,7 +2354,10 @@ bool OSDMonitor::preprocess_command(MMonCommand *m) } else if (prefix == "osd crush rule dump") { string format; cmd_getval(g_ceph_context, cmdmap, "format", format, string("json-pretty")); - boost::scoped_ptr f(new_formatter(format)); + Formatter *fp = new_formatter(format); + if (!fp) + fp = new_formatter("json-pretty"); + boost::scoped_ptr f(fp); f->open_array_section("rules"); osdmap.crush->dump_rules(f.get()); f->close_section(); @@ -2362,7 +2368,10 @@ bool OSDMonitor::preprocess_command(MMonCommand *m) } else if (prefix == "osd crush dump") { string format; cmd_getval(g_ceph_context, cmdmap, "format", format, string("json-pretty")); - boost::scoped_ptr f(new_formatter(format)); + Formatter *fp = new_formatter(format); + if (!fp) + fp = new_formatter("json-pretty"); + boost::scoped_ptr f(fp); f->open_object_section("crush_map"); osdmap.crush->dump(f.get()); f->close_section(); -- 2.39.5