]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
process-util: make our freeze() routine do something useful
authorMichal Sekletar <msekleta@redhat.com>
Fri, 12 Jan 2018 12:05:48 +0000 (13:05 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 12 Jan 2018 16:50:02 +0000 (17:50 +0100)
When we crash we freeze() our-self (or possibly we reboot the machine if
that is configured). However, calling pause() is very unhelpful thing to
do. We should at least continue to do what init systems being doing
since 70's and that is reaping zombies. Otherwise zombies start to
accumulate on the system which is a very bad thing. As that can prevent
admin from taking manual steps to reboot the machine in somewhat
graceful manner (e.g. manually stopping services, unmounting data
volumes  and calling reboot -f).

Fixes #7783

src/basic/process-util.c

index 9fc546466558c2930edd4a92da3d76892348cd7f..dc7c9ef9ef686a58052c8c9027a235096febd765 100644 (file)
@@ -949,6 +949,17 @@ noreturn void freeze(void) {
 
         sync();
 
+        /* Let's not freeze right away, but keep reaping zombies. */
+        for (;;) {
+                int r;
+                siginfo_t si = {};
+
+                r = waitid(P_ALL, 0, &si, WEXITED);
+                if (r < 0 && errno != EINTR)
+                        break;
+        }
+
+        /* waitid() failed with an unexpected error, things are really borked. Freeze now! */
         for (;;)
                 pause();
 }