mini_init: Don't call exit(3), catch SIGTERM
authorFrançois Tigeot <ftigeot@wolfpond.org>
Wed, 9 Apr 2014 10:54:23 +0000 (12:54 +0200)
committerFrançois Tigeot <ftigeot@wolfpond.org>
Wed, 9 Apr 2014 20:23:31 +0000 (22:23 +0200)
* During a reboot sequence, all processes are routinely killed.

* Sadly, if init dies, the kernel panics.

* Try to avoid this situation by ignoring SIGTERM and not explicitely
  calling exit(3) if the child process dies and the chrooting sequence
  fails.

share/initrd/mini_init/oinit.c

index 8dca57a..b52eb78 100644 (file)
@@ -78,6 +78,9 @@ main(int argc __unused, char **argv)
        if (getuid() != 0)
                errx(1, "%s", strerror(EPERM));
 
+       /* Init is not allowed to die, it would make the kernel panic */
+       signal(SIGTERM, SIG_IGN);
+
        runcom(argv);
        return 1;
 }
@@ -136,12 +139,18 @@ runcom(char **argv_orig)
 
        error = chroot_kernel("/new_root");
        if (error)
-               exit(1);
+               goto chroot_failed;
 
        error = chroot("/new_root");
        if (error)
-               exit(1);
+               goto chroot_failed;
 
        execv("/sbin/init", __DECONST(char **, argv_orig));
+
+       /* We failed to exec /sbin/init in the chroot, sleep forever */
+chroot_failed:
+       while(1) {
+               sleep(3);
+       };
 }