init: make sure fd 0,1,2 are not closed, + related optimizations.
No binary (build failed)
—
(log yok)
| @@ -273,6 +273,9 @@ static void console_init(void) | |
| while (fd > 2) close(fd--); | |
| } | |
| messageD(L_LOG, "console='%s'", s); | |
| + | } else { |
| + | /* Make sure fd 0,1,2 are not closed */ |
| + | bb_sanitize_stdio(); |
| } | |
| s = getenv("TERM"); | |
| @@ -288,20 +291,14 @@ static void console_init(void) | |
| putenv((char*)"TERM=linux"); | |
| } | |
| - | static void fixup_argv(int argc, char **argv, const char *new_argv0) |
| + | static void fixup_argv(char **argv) |
| { | |
| - | int len; |
| - | |
| /* Fix up argv[0] to be certain we claim to be init */ | |
| - | len = strlen(argv[0]); |
| - | strncpy(argv[0], new_argv0, len); |
| + | strncpy(argv[0], "init", strlen(argv[0])); |
| /* Wipe argv[1]-argv[N] so they don't clutter the ps listing */ | |
| - | len = 1; |
| - | while (argc > len) { |
| - | memset(argv[len], 0, strlen(argv[len])); |
| - | len++; |
| - | } |
| + | while (*++argv) |
| + | memset(*argv, 0, strlen(*argv)); |
| } | |
| /* Open the new terminal device */ | |
| @@ -919,6 +916,7 @@ int init_main(int argc, char **argv) | |
| init_reboot(RB_DISABLE_CAD); | |
| #endif | |
| + | |
| /* Figure out where the default console should be */ | |
| console_init(); | |
| set_sane_term(); | |
| @@ -972,7 +970,7 @@ int init_main(int argc, char **argv) | |
| if (getenv("SELINUX_INIT") == NULL) { | |
| int enforce = 0; | |
| - | putenv("SELINUX_INIT=YES"); |
| + | putenv((char*)"SELINUX_INIT=YES"); |
| if (selinux_init_load_policy(&enforce) == 0) { | |
| BB_EXECVP(argv[0], argv); | |
| } else if (enforce > 0) { | |
| @@ -986,7 +984,7 @@ int init_main(int argc, char **argv) | |
| #endif /* CONFIG_SELINUX */ | |
| /* Make the command line just say "init" -- thats all, nothing else */ | |
| - | fixup_argv(argc, argv, "init"); |
| + | fixup_argv(argv); |
| /* Now run everything that needs to be run */ | |
| @@ -202,7 +202,6 @@ int spawn_and_wait(char **argv) | |
| return wait4pid(rc); | |
| } | |
| - | |
| #if !BB_MMU | |
| void forkexit_or_rexec(char **argv) | |
| { | |
| @@ -261,17 +260,18 @@ void bb_daemonize_or_rexec(int flags, char **argv) | |
| if (!(flags & DAEMON_ONLY_SANITIZE)) { | |
| forkexit_or_rexec(argv); | |
| - | /* if daemonizing, make sure we detach from stdio */ |
| + | /* if daemonizing, make sure we detach from stdio & ctty */ |
| setsid(); | |
| dup2(fd, 0); | |
| dup2(fd, 1); | |
| dup2(fd, 2); | |
| } | |
| - | if (fd > 2) |
| + | while (fd > 2) { |
| close(fd--); | |
| - | if (flags & DAEMON_CLOSE_EXTRA_FDS) |
| - | while (fd > 2) |
| - | close(fd--); /* close everything after fd#2 */ |
| + | if (!(flags & DAEMON_CLOSE_EXTRA_FDS)) |
| + | return; |
| + | /* else close everything after fd#2 */ |
| + | } |
| } | |
| void bb_sanitize_stdio(void) | |
| @@ -160,10 +160,11 @@ static ALWAYS_INLINE int check_securetty(void) { return 1; } | |
| static void get_username_or_die(char *buf, int size_buf) | |
| { | |
| int c, cntdown; | |
| + | |
| cntdown = EMPTY_USERNAME_COUNT; | |
| - | prompt: |
| - | /* skip whitespace */ |
| + | prompt: |
| print_login_prompt(); | |
| + | /* skip whitespace */ |
| do { | |
| c = getchar(); | |
| if (c == EOF) exit(1); | |