From b1e8d63bf787dea415eabda99def9d7e4aff4f9d Mon Sep 17 00:00:00 2001 From: John Spray Date: Mon, 23 Apr 2018 17:15:22 -0400 Subject: [PATCH] mgr: handle commands sent to unavailable modules There are some up-front checks in DaemonServer but it shouldn't assume that its checks are necessarily going to match the choices about how ActivePyModules composes its ::modules member, so let's have some extra checks to avoid risk of crashing mgr on commands sent to unhealthy/unloaded modules. Signed-off-by: John Spray --- src/mgr/ActivePyModule.cc | 7 +++++++ src/mgr/ActivePyModules.cc | 9 +++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/mgr/ActivePyModule.cc b/src/mgr/ActivePyModule.cc index 185ef44542884..2f52dd622620a 100644 --- a/src/mgr/ActivePyModule.cc +++ b/src/mgr/ActivePyModule.cc @@ -110,6 +110,13 @@ int ActivePyModule::handle_command( assert(ss != nullptr); assert(ds != nullptr); + if (pClassInstance == nullptr) { + // Not the friendliest error string, but we could only + // hit this in quite niche cases, if at all. + *ss << "Module not instantiated"; + return -EINVAL; + } + Gil gil(py_module->pMyThreadState, true); PyFormatter f; diff --git a/src/mgr/ActivePyModules.cc b/src/mgr/ActivePyModules.cc index cc604d175a9eb..4cb8a0883a9e2 100644 --- a/src/mgr/ActivePyModules.cc +++ b/src/mgr/ActivePyModules.cc @@ -756,9 +756,14 @@ int ActivePyModules::handle_command( std::stringstream *ss) { lock.Lock(); - auto mod = modules.at(module_name).get(); + auto mod_iter = modules.find(module_name); + if (mod_iter == modules.end()) { + *ss << "Module '" << module_name << "' is not available"; + return -ENOENT; + } + lock.Unlock(); - return mod->handle_command(cmdmap, ds, ss); + return mod_iter->second->handle_command(cmdmap, ds, ss); } void ActivePyModules::get_health_checks(health_check_map_t *checks) -- 2.39.5