The libvirtd daemon currently ignores the return status of
virDriverLoadModule entirely. This is way too loose, resulting in many
important problems going undiagnosed, resulting in a libvirtd that may
never work correctly. We should only ignore a non-existant module, and
pass back any fatal errors.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
src/remote/remote_daemon.c | 61 +++++++++++++++++++++++++++-------------------
1 file changed, 36 insertions(+), 25 deletions(-)
diff --git a/src/remote/remote_daemon.c b/src/remote/remote_daemon.c
index b4f89d4fd7..27377fe3bc 100644
--- a/src/remote/remote_daemon.c
+++ b/src/remote/remote_daemon.c
@@ -87,6 +87,7 @@ enum {
VIR_DAEMON_ERR_CONFIG,
VIR_DAEMON_ERR_HOOKS,
VIR_DAEMON_ERR_AUDIT,
+ VIR_DAEMON_ERR_DRIVER,
VIR_DAEMON_ERR_LAST
};
@@ -102,7 +103,8 @@ VIR_ENUM_IMPL(virDaemonErr, VIR_DAEMON_ERR_LAST,
"Unable to initialize network sockets",
"Unable to load configuration file",
"Unable to look for hook scripts",
- "Unable to initialize audit system")
+ "Unable to initialize audit system",
+ "Unable to initialize driver")
static int daemonForkIntoBackground(const char *argv0)
{
@@ -294,9 +296,7 @@ static int daemonErrorLogFilter(virErrorPtr err, int priority)
}
-#define VIR_DAEMON_LOAD_MODULE(func, module) \
- virDriverLoadModule(module, #func, false)
-static void daemonInitialize(void)
+static int daemonInitialize(void)
{
/*
* Note that the order is important: the first ones have a higher
@@ -305,52 +305,60 @@ static void daemonInitialize(void)
* driver, since their resources must be auto-started before any
* domains can be auto-started.
*/
- /* We don't care if any of these fail, because the whole point
- * is to allow users to only install modules they want to use.
- * If they try to open a connection for a module that
- * is not loaded they'll get a suitable error at that point
- */
#ifdef WITH_NETWORK
- VIR_DAEMON_LOAD_MODULE(networkRegister, "network");
+ if (virDriverLoadModule("network", "networkRegister", false) <
0)
+ return -1;
#endif
#ifdef WITH_INTERFACE
- VIR_DAEMON_LOAD_MODULE(interfaceRegister, "interface");
+ if (virDriverLoadModule("interface", "interfaceRegister", false)
< 0)
+ return -1;
#endif
#ifdef WITH_STORAGE
- VIR_DAEMON_LOAD_MODULE(storageRegister, "storage");
+ if (virDriverLoadModule("storage", "storageRegister", false) <
0)
+ return -1;
#endif
#ifdef WITH_NODE_DEVICES
- VIR_DAEMON_LOAD_MODULE(nodedevRegister, "nodedev");
+ if (virDriverLoadModule("nodedev", "nodedevRegister", false) <
0)
+ return -1;
#endif
#ifdef WITH_SECRETS
- VIR_DAEMON_LOAD_MODULE(secretRegister, "secret");
+ if (virDriverLoadModule("secret", "secretRegister", false) <
0)
+ return -1;
#endif
#ifdef WITH_NWFILTER
- VIR_DAEMON_LOAD_MODULE(nwfilterRegister, "nwfilter");
+ if (virDriverLoadModule("nwfilter", "nwfilterRegister", false)
< 0)
+ return -1;
#endif
#ifdef WITH_LIBXL
- VIR_DAEMON_LOAD_MODULE(libxlRegister, "libxl");
+ if (virDriverLoadModule("libxl", "libxlRegister", false) < 0)
+ return -1;
#endif
#ifdef WITH_QEMU
- VIR_DAEMON_LOAD_MODULE(qemuRegister, "qemu");
+ if (virDriverLoadModule("qemu", "qemuRegister", false) < 0)
+ return -1;
#endif
#ifdef WITH_LXC
- VIR_DAEMON_LOAD_MODULE(lxcRegister, "lxc");
+ if (virDriverLoadModule("lxc", "lxcRegister", false) < 0)
+ return -1;
#endif
#ifdef WITH_UML
- VIR_DAEMON_LOAD_MODULE(umlRegister, "uml");
+ if (virDriverLoadModule("uml", "umlRegister", false) < 0)
+ return -1;
#endif
#ifdef WITH_VBOX
- VIR_DAEMON_LOAD_MODULE(vboxRegister, "vbox");
+ if (virDriverLoadModule("vbox", "vboxRegister", false) < 0)
+ return -1;
#endif
#ifdef WITH_BHYVE
- VIR_DAEMON_LOAD_MODULE(bhyveRegister, "bhyve");
+ if (virDriverLoadModule("bhyve", "bhyveRegister", false) < 0)
+ return -1;
#endif
#ifdef WITH_VZ
- VIR_DAEMON_LOAD_MODULE(vzRegister, "vz");
+ if (virDriverLoadModule("vz", "vzRegister", false) < 0)
+ return -1;
#endif
+ return 0;
}
-#undef VIR_DAEMON_LOAD_MODULE
static int ATTRIBUTE_NONNULL(3)
@@ -1283,7 +1291,7 @@ int main(int argc, char **argv) {
}
if (!(dmn = virNetDaemonNew())) {
- ret = VIR_DAEMON_ERR_INIT;
+ ret = VIR_DAEMON_ERR_DRIVER;
goto cleanup;
}
@@ -1309,7 +1317,10 @@ int main(int argc, char **argv) {
goto cleanup;
}
- daemonInitialize();
+ if (daemonInitialize() < 0) {
+ ret = VIR_DAEMON_ERR_INIT;
+ goto cleanup;
+ }
remoteProcs[REMOTE_PROC_AUTH_LIST].needAuth = false;
remoteProcs[REMOTE_PROC_AUTH_SASL_INIT].needAuth = false;
--
2.14.3