[PATCH 1/2] remote_daemon: Set shutdown callbacks only after init is done
Peter Krempa
pkrempa at redhat.com
Fri Dec 10 12:39:54 UTC 2021
On Thu, Dec 09, 2021 at 15:43:55 +0100, Michal Privoznik wrote:
> 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 at redhat.com>
> ---
> src/remote/remote_daemon.c | 7 ++++---
> 1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/src/remote/remote_daemon.c b/src/remote/remote_daemon.c
> index de43a54c2e..4e10f3ad23 100644
> --- a/src/remote/remote_daemon.c
> +++ b/src/remote/remote_daemon.c
> @@ -626,6 +626,10 @@ static void daemonRunStateInit(void *opaque)
>
> driversInitialized = true;
>
> + virNetDaemonSetShutdownCallbacks(dmn,
> + virStateShutdownPrepare,
> + virStateShutdownWait);
> +
Okay so this placement ensures that the state shutdown code will only
ever be executed if the state was already initialized ...
> /* 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);
... which wasn't always true here.
> virNetDaemonRun(dmn);
>
> ret = 0;
So at this point it's still possible that the daemon will quit without
the callbacks being called, but tat was possible even before.
Based on the above and the fact that I wasn't able to reproduce the
crash:
Reviewed-by: Peter Krempa <pkrempa at redhat.com>
More information about the libvir-list
mailing list