init: do not sleep forever on usage errors
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 24 Oct 2010 22:40:32 +0000 (00:40 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 24 Oct 2010 22:40:32 +0000 (00:40 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
init/init.c

index 1234807..a7bbd5e 100644 (file)
@@ -660,7 +660,9 @@ static struct init_action *mark_terminated(pid_t pid)
                                return a;
                        }
                }
-               update_utmp(pid, DEAD_PROCESS, /*tty_name:*/ NULL, /*username:*/ NULL, /*hostname:*/ NULL);
+               update_utmp(pid, DEAD_PROCESS, /*tty_name:*/ NULL,
+                               /*username:*/ NULL,
+                               /*hostname:*/ NULL);
        }
        return NULL;
 }
@@ -1086,8 +1088,6 @@ static int check_delayed_sigs(void)
 int init_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int init_main(int argc UNUSED_PARAM, char **argv)
 {
-       die_sleep = 30 * 24*60*60; /* if xmalloc would ever die... */
-
        if (argv[1] && strcmp(argv[1], "-q") == 0) {
                return kill(1, SIGHUP);
        }
@@ -1106,6 +1106,15 @@ int init_main(int argc UNUSED_PARAM, char **argv)
 #endif
        }
 
+       /* If, say, xmalloc would ever die, we don't want to oops kernel
+        * by exiting.
+        * NB: we set die_sleep *after* PID 1 check and bb_show_usage.
+        * Otherwise, for example, "init u" ("please rexec yourself"
+        * command for sysvinit) will show help text (which isn't too bad),
+        * *and sleep forever* (which is bad!)
+        */
+       die_sleep = 30 * 24*60*60;
+
        /* Figure out where the default console should be */
        console_init();
        set_sane_term();
@@ -1173,7 +1182,7 @@ int init_main(int argc UNUSED_PARAM, char **argv)
                        /* SELinux in enforcing mode but load_policy failed */
                        message(L_CONSOLE, "can't load SELinux Policy. "
                                "Machine is in enforcing mode. Halting now.");
-                       exit(EXIT_FAILURE);
+                       return EXIT_FAILURE;
                }
        }
 #endif