]> xenbits.xensource.com Git - libvirt.git/commitdiff
remote_daemon: Set shutdown callbacks only after init is done
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 9 Dec 2021 14:29:43 +0000 (15:29 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 10 Dec 2021 12:51:01 +0000 (13:51 +0100)
The initialization of drivers happens in a separate thread.
However, the main thread continues initialization and sets
shutdown callbacks (virStateShutdownPrepare() and
virStateShutdownWait()) even though the driver init thread is
still running. This is dangerous because if the daemon decides to
quit early (e.g. because SIGINT was delivered) the
shutdownPrepare and shutdownWait callback are called over
partially init drivers.

Set callbacks only after all drivers were initialized.

Resolves: https://gitlab.com/libvirt/libvirt/-/issues/218
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2027400

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
src/remote/remote_daemon.c

index de43a54c2e75b8ee5259bc04420e3e49368e38a9..4e10f3ad230779cf2282629a83f0fd8875f72c9e 100644 (file)
@@ -626,6 +626,10 @@ static void daemonRunStateInit(void *opaque)
 
     driversInitialized = true;
 
+    virNetDaemonSetShutdownCallbacks(dmn,
+                                     virStateShutdownPrepare,
+                                     virStateShutdownWait);
+
     /* Tie the non-privileged daemons to the session/shutdown lifecycle */
     if (!virNetDaemonIsPrivileged(dmn)) {
 
@@ -1214,9 +1218,6 @@ int main(int argc, char **argv) {
 #endif
 
     /* Run event loop. */
-    virNetDaemonSetShutdownCallbacks(dmn,
-                                     virStateShutdownPrepare,
-                                     virStateShutdownWait);
     virNetDaemonRun(dmn);
 
     ret = 0;