From: Danny Al-Gaaf Date: Wed, 12 Nov 2014 16:46:43 +0000 (+0100) Subject: ceph_authtool.cc: catch ceph::FailedAssertion exception X-Git-Tag: v0.90~25^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6fd2123b15716fb004a8c13f40ef048e963491b6;p=ceph.git ceph_authtool.cc: catch ceph::FailedAssertion exception Fix for: CID 717141 (#1-19): Uncaught exception (UNCAUGHT_EXCEPT) root_function: In function main(int, char const **) an exception of type ceph::FailedAssertion is thrown and never caught. Signed-off-by: Danny Al-Gaaf --- diff --git a/src/tools/ceph_authtool.cc b/src/tools/ceph_authtool.cc index a4d3baeea92..3cf07d69193 100644 --- a/src/tools/ceph_authtool.cc +++ b/src/tools/ceph_authtool.cc @@ -68,212 +68,216 @@ int main(int argc, const char **argv) map caps; std::string fn; - global_init(NULL, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, - CINIT_FLAG_NO_DEFAULT_CONFIG_FILE); - std::vector::iterator i; - for (i = args.begin(); i != args.end(); ) { - std::string val; - if (ceph_argparse_double_dash(args, i)) { - break; - } else if (ceph_argparse_flag(args, i, "-g", "--gen-key", (char*)NULL)) { - gen_key = true; - } else if (ceph_argparse_flag(args, i, "--gen-print-key", (char*)NULL)) { - gen_print_key = true; - } else if (ceph_argparse_witharg(args, i, &val, "-a", "--add-key", (char*)NULL)) { - add_key = val; - } else if (ceph_argparse_flag(args, i, "-l", "--list", (char*)NULL)) { - list = true; - } else if (ceph_argparse_witharg(args, i, &val, "--caps", (char*)NULL)) { - caps_fn = val; - } else if (ceph_argparse_witharg(args, i, &val, "--cap", (char*)NULL)) { - std::string my_key = val; - if (i == args.end()) { - cerr << "must give two arguments to --cap: key and val." << std::endl; - exit(1); + try { + global_init(NULL, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, + CINIT_FLAG_NO_DEFAULT_CONFIG_FILE); + std::vector::iterator i; + for (i = args.begin(); i != args.end(); ) { + std::string val; + if (ceph_argparse_double_dash(args, i)) { + break; + } else if (ceph_argparse_flag(args, i, "-g", "--gen-key", (char*)NULL)) { + gen_key = true; + } else if (ceph_argparse_flag(args, i, "--gen-print-key", (char*)NULL)) { + gen_print_key = true; + } else if (ceph_argparse_witharg(args, i, &val, "-a", "--add-key", (char*)NULL)) { + add_key = val; + } else if (ceph_argparse_flag(args, i, "-l", "--list", (char*)NULL)) { + list = true; + } else if (ceph_argparse_witharg(args, i, &val, "--caps", (char*)NULL)) { + caps_fn = val; + } else if (ceph_argparse_witharg(args, i, &val, "--cap", (char*)NULL)) { + std::string my_key = val; + if (i == args.end()) { + cerr << "must give two arguments to --cap: key and val." << std::endl; + exit(1); + } + std::string my_val = *i; + ++i; + ::encode(my_val, caps[my_key]); + } else if (ceph_argparse_flag(args, i, "-p", "--print-key", (char*)NULL)) { + print_key = true; + } else if (ceph_argparse_flag(args, i, "-C", "--create-keyring", (char*)NULL)) { + create_keyring = true; + } else if (ceph_argparse_witharg(args, i, &val, "--import-keyring", (char*)NULL)) { + import_keyring = val; + } else if (ceph_argparse_witharg(args, i, &val, "-u", "--set-uid", (char*)NULL)) { + std::string err; + auid = strict_strtoll(val.c_str(), 10, &err); + if (!err.empty()) { + cerr << "error parsing UID: " << err << std::endl; + exit(1); + } + set_auid = true; + } else if (fn.empty()) { + fn = *i++; + } else { + cerr << argv[0] << ": unexpected '" << *i << "'" << std::endl; + usage(); } - std::string my_val = *i; - ++i; - ::encode(my_val, caps[my_key]); - } else if (ceph_argparse_flag(args, i, "-p", "--print-key", (char*)NULL)) { - print_key = true; - } else if (ceph_argparse_flag(args, i, "-C", "--create-keyring", (char*)NULL)) { - create_keyring = true; - } else if (ceph_argparse_witharg(args, i, &val, "--import-keyring", (char*)NULL)) { - import_keyring = val; - } else if (ceph_argparse_witharg(args, i, &val, "-u", "--set-uid", (char*)NULL)) { + } + if (fn.empty() && !gen_print_key) { + cerr << argv[0] << ": must specify filename" << std::endl; + usage(); + } + if (!(gen_key || + gen_print_key || + !add_key.empty() || + list || + !caps_fn.empty() || + !caps.empty() || + set_auid || + print_key || + create_keyring || + !import_keyring.empty())) { + cerr << "no command specified" << std::endl; + usage(); + } + if (gen_key && (!add_key.empty())) { + cerr << "can't both gen_key and add_key" << std::endl; + usage(); + } + + common_init_finish(g_ceph_context); + EntityName ename(g_conf->name); + + if (gen_print_key) { + CryptoKey key; + key.create(g_ceph_context, CEPH_CRYPTO_AES); + cout << key << std::endl; + return 0; + } + + // keyring -------- + bool modified = false; + KeyRing keyring; + + bufferlist bl; + int r = 0; + if (create_keyring) { + cout << "creating " << fn << std::endl; + modified = true; + } else { std::string err; - auid = strict_strtoll(val.c_str(), 10, &err); - if (!err.empty()) { - cerr << "error parsing UID: " << err << std::endl; - exit(1); + r = bl.read_file(fn.c_str(), &err); + if (r >= 0) { + try { + bufferlist::iterator iter = bl.begin(); + ::decode(keyring, iter); + } catch (const buffer::error &err) { + cerr << "error reading file " << fn << std::endl; + exit(1); + } + } else { + cerr << "can't open " << fn << ": " << err << std::endl; + exit(1); } - set_auid = true; - } else if (fn.empty()) { - fn = *i++; - } else { - cerr << argv[0] << ": unexpected '" << *i << "'" << std::endl; - usage(); } - } - if (fn.empty() && !gen_print_key) { - cerr << argv[0] << ": must specify filename" << std::endl; - usage(); - } - if (!(gen_key || - gen_print_key || - !add_key.empty() || - list || - !caps_fn.empty() || - !caps.empty() || - set_auid || - print_key || - create_keyring || - !import_keyring.empty())) { - cerr << "no command specified" << std::endl; - usage(); - } - if (gen_key && (!add_key.empty())) { - cerr << "can't both gen_key and add_key" << std::endl; - usage(); - } - - common_init_finish(g_ceph_context); - EntityName ename(g_conf->name); - - if (gen_print_key) { - CryptoKey key; - key.create(g_ceph_context, CEPH_CRYPTO_AES); - cout << key << std::endl; - return 0; - } - - // keyring -------- - bool modified = false; - KeyRing keyring; - - bufferlist bl; - int r = 0; - if (create_keyring) { - cout << "creating " << fn << std::endl; - modified = true; - } else { - std::string err; - r = bl.read_file(fn.c_str(), &err); - if (r >= 0) { - try { - bufferlist::iterator iter = bl.begin(); - ::decode(keyring, iter); - } catch (const buffer::error &err) { - cerr << "error reading file " << fn << std::endl; - exit(1); + + // write commands + if (!import_keyring.empty()) { + KeyRing other; + bufferlist obl; + std::string err; + int r = obl.read_file(import_keyring.c_str(), &err); + if (r >= 0) { + try { + bufferlist::iterator iter = obl.begin(); + ::decode(other, iter); + } catch (const buffer::error &err) { + cerr << "error reading file " << import_keyring << std::endl; + exit(1); + } + + cout << "importing contents of " << import_keyring << " into " << fn << std::endl; + //other.print(cout); + keyring.import(g_ceph_context, other); + modified = true; + } else { + cerr << "can't open " << import_keyring << ": " << err << std::endl; + exit(1); } - } else { - cerr << "can't open " << fn << ": " << err << std::endl; - exit(1); } - } - - // write commands - if (!import_keyring.empty()) { - KeyRing other; - bufferlist obl; - std::string err; - int r = obl.read_file(import_keyring.c_str(), &err); - if (r >= 0) { + if (gen_key) { + EntityAuth eauth; + eauth.key.create(g_ceph_context, CEPH_CRYPTO_AES); + keyring.add(ename, eauth); + modified = true; + } + if (!add_key.empty()) { + EntityAuth eauth; try { - bufferlist::iterator iter = obl.begin(); - ::decode(other, iter); + eauth.key.decode_base64(add_key); } catch (const buffer::error &err) { - cerr << "error reading file " << import_keyring << std::endl; - exit(1); + cerr << "can't decode key '" << add_key << "'" << std::endl; + exit(1); } - - cout << "importing contents of " << import_keyring << " into " << fn << std::endl; - //other.print(cout); - keyring.import(g_ceph_context, other); + keyring.add(ename, eauth); modified = true; - } else { - cerr << "can't open " << import_keyring << ": " << err << std::endl; - exit(1); + cout << "added entity " << ename << " auth " << eauth << std::endl; } - } - if (gen_key) { - EntityAuth eauth; - eauth.key.create(g_ceph_context, CEPH_CRYPTO_AES); - keyring.add(ename, eauth); - modified = true; - } - if (!add_key.empty()) { - EntityAuth eauth; - try { - eauth.key.decode_base64(add_key); - } catch (const buffer::error &err) { - cerr << "can't decode key '" << add_key << "'" << std::endl; - exit(1); + if (!caps_fn.empty()) { + ConfFile cf; + std::deque parse_errors; + if (cf.parse_file(caps_fn, &parse_errors, &cerr) != 0) { + cerr << "could not parse caps file " << caps_fn << std::endl; + exit(1); + } + complain_about_parse_errors(g_ceph_context, &parse_errors); + map caps; + const char *key_names[] = { "mon", "osd", "mds", NULL }; + for (int i=0; key_names[i]; i++) { + std::string val; + if (cf.read("global", key_names[i], val) == 0) { + bufferlist bl; + ::encode(val, bl); + string s(key_names[i]); + caps[s] = bl; + } + } + keyring.set_caps(ename, caps); + modified = true; } - keyring.add(ename, eauth); - modified = true; - cout << "added entity " << ename << " auth " << eauth << std::endl; - } - if (!caps_fn.empty()) { - ConfFile cf; - std::deque parse_errors; - if (cf.parse_file(caps_fn, &parse_errors, &cerr) != 0) { - cerr << "could not parse caps file " << caps_fn << std::endl; - exit(1); + if (!caps.empty()) { + keyring.set_caps(ename, caps); + modified = true; } - complain_about_parse_errors(g_ceph_context, &parse_errors); - map caps; - const char *key_names[] = { "mon", "osd", "mds", NULL }; - for (int i=0; key_names[i]; i++) { - std::string val; - if (cf.read("global", key_names[i], val) == 0) { - bufferlist bl; - ::encode(val, bl); - string s(key_names[i]); - caps[s] = bl; - } + if (set_auid) { + keyring.set_uid(ename, auid); + modified = true; } - keyring.set_caps(ename, caps); - modified = true; - } - if (!caps.empty()) { - keyring.set_caps(ename, caps); - modified = true; - } - if (set_auid) { - keyring.set_uid(ename, auid); - modified = true; - } - - // read commands - if (list) { - try { - keyring.print(cout); - } catch (ceph::buffer::end_of_buffer &eob) { - cout << "Exception (end_of_buffer) in print(), exit." << std::endl; - exit(1); + + // read commands + if (list) { + try { + keyring.print(cout); + } catch (ceph::buffer::end_of_buffer &eob) { + cout << "Exception (end_of_buffer) in print(), exit." << std::endl; + exit(1); + } } - } - if (print_key) { - CryptoKey key; - if (keyring.get_secret(ename, key)) { - cout << key << std::endl; - } else { - cerr << "entity " << ename << " not found" << std::endl; + if (print_key) { + CryptoKey key; + if (keyring.get_secret(ename, key)) { + cout << key << std::endl; + } else { + cerr << "entity " << ename << " not found" << std::endl; + } } - } - - // write result? - if (modified) { - bufferlist bl; - keyring.encode_plaintext(bl); - r = bl.write_file(fn.c_str(), 0600); - if (r < 0) { - cerr << "could not write " << fn << std::endl; + + // write result? + if (modified) { + bufferlist bl; + keyring.encode_plaintext(bl); + r = bl.write_file(fn.c_str(), 0600); + if (r < 0) { + cerr << "could not write " << fn << std::endl; + } + //cout << "wrote " << bl.length() << " bytes to " << fn << std::endl; } - //cout << "wrote " << bl.length() << " bytes to " << fn << std::endl; - } - + } catch (ceph::FailedAssertion &a) { + cout << "Failed assert, exit." << std::endl; + exit(1); + } return 0; }