]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
update-utmp: fix assertion failure if rescue.target, multi-user.target and graphical...
authorTommi Rantala <tommi.t.rantala@nokia.com>
Mon, 5 Aug 2019 11:01:58 +0000 (14:01 +0300)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 14 Aug 2019 16:22:09 +0000 (18:22 +0200)
If rescue.target, multi-user.target and graphical.target are all
inactive, get_current_runlevel() is not able to determine current
runlevel, and returns with zero. This zero runlevel value results to
assertion failure in utmp_put_runlevel().

 # systemctl stop rescue.target multi-user.target graphical.target
 # systemctl start systemd-update-utmp-runlevel.service

 systemd[1]: Stopped target Graphical Interface.
 systemd[1]: Stopped target Multi-User System.
 systemd[1]: Starting Update UTMP about System Runlevel Changes...
 systemd-update-utmp[67]: Assertion 'runlevel > 0' failed at src/shared/utmp-wtmp.c:275, function utmp_put_runlevel(). Aborting.
 systemd[1]: systemd-update-utmp-runlevel.service: Main process exited, code=dumped, status=6/ABRT
 systemd[1]: systemd-update-utmp-runlevel.service: Failed with result 'core-dump'.
 systemd[1]: Failed to start Update UTMP about System Runlevel Changes.

Let's just print a warning in this case and skip the utmp update, to
avoid systemd-update-utmp-runlevel.service failures.

src/update-utmp/update-utmp.c

index bfc78b9739abf4aefd9d25c7bd436ba0d5da2f7b..56fb937647e5b09bc5e864ff4428cb83a65adc43 100644 (file)
@@ -191,6 +191,9 @@ static int on_runlevel(Context *c) {
         if (runlevel < 0)
                 return runlevel;
 
+        if (runlevel == 0)
+                return log_warning("Failed to get new runlevel, utmp update skipped.");
+
         if (previous == runlevel)
                 return 0;