From e06bed30cfcde7b9e320aff8a4c878c72416c4c4 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sat, 27 Jan 2007 22:21:12 +0000 Subject: [PATCH] use bb_sanitize_stdio() where appropriate --- coreutils/nohup.c | 32 +++++++++++++++++++------------- libbb/xfuncs.c | 2 +- loginutils/getty.c | 7 ++++--- networking/traceroute.c | 6 ++---- networking/udhcp/common.c | 16 +--------------- 5 files changed, 27 insertions(+), 36 deletions(-) diff --git a/coreutils/nohup.c b/coreutils/nohup.c index 21adfc1c3..317d2a8ae 100644 --- a/coreutils/nohup.c +++ b/coreutils/nohup.c @@ -14,16 +14,18 @@ int nohup_main(int argc, char **argv) { - int temp, nullfd; - char *nohupout, *home = NULL; + int nullfd; + const char *nohupout; + char *home = NULL; xfunc_error_retval = 127; - if (argc<2) bb_show_usage(); + if (argc < 2) bb_show_usage(); nullfd = xopen(bb_dev_null, O_WRONLY|O_APPEND); /* If stdin is a tty, detach from it. */ - if (isatty(STDIN_FILENO)) dup2(nullfd, STDIN_FILENO); + if (isatty(STDIN_FILENO)) + dup2(nullfd, STDIN_FILENO); nohupout = "nohup.out"; /* Redirect stdout to nohup.out, either in "." or in "$HOME". */ @@ -38,16 +40,20 @@ int nohup_main(int argc, char **argv) } } else dup2(nullfd, STDOUT_FILENO); - /* If we have a tty on strderr, announce filename and redirect to stdout. + /* If we have a tty on stderr, announce filename and redirect to stdout. * Else redirect to /dev/null. */ - temp = isatty(STDERR_FILENO); - if (temp) bb_error_msg("appending to %s", nohupout); - dup2(temp ? STDOUT_FILENO : nullfd, STDERR_FILENO); - close(nullfd); - signal (SIGHUP, SIG_IGN); - - execvp(argv[1],argv+1); - if (00 && ENABLE_FEATURE_CLEAN_UP && home) free(nohupout); + if (isatty(STDERR_FILENO)) { + bb_error_msg("appending to %s", nohupout); + dup2(STDOUT_FILENO, STDERR_FILENO); + } else dup2(nullfd, STDERR_FILENO); + + if (nullfd > 2) + close(nullfd); + signal(SIGHUP, SIG_IGN); + + execvp(argv[1], argv+1); + if (ENABLE_FEATURE_CLEAN_UP && home) + free((char*)nohupout); bb_perror_msg_and_die("%s", argv[1]); } diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c index f7300a6d9..54d291ab1 100644 --- a/libbb/xfuncs.c +++ b/libbb/xfuncs.c @@ -518,7 +518,7 @@ void bb_sanitize_stdio_maybe_daemonize(int daemonize) int fd; /* Mega-paranoid */ fd = xopen(bb_dev_null, O_RDWR); - while (fd < 2) + while ((unsigned)fd < 2) fd = dup(fd); /* have 0,1,2 open at least to /dev/null */ if (daemonize) { pid_t pid = fork(); diff --git a/loginutils/getty.c b/loginutils/getty.c index be4938972..f2c2b4afb 100644 --- a/loginutils/getty.c +++ b/loginutils/getty.c @@ -264,7 +264,7 @@ static void open_tty(char *tty, struct termios *tp, int local) */ if ((fcntl(0, F_GETFL, 0) & O_RDWR) != O_RDWR) - bb_error_msg_and_die("%s: not open for read/write", tty); + bb_error_msg_and_die("stdin is not open for read/write"); } /* Replace current standard output/error fd's with new ones */ @@ -314,7 +314,8 @@ static void open_tty(char *tty, struct termios *tp, int local) strcpy(vcsa, "vcsa"); strcpy(vcsa + 4, tty + 3); - id = (gr = getgrnam("sys")) ? gr->gr_gid : 0; + gr = getgrnam("sys"); + id = gr ? gr->gr_gid : 0; chown(vcs, 0, id); chmod(vcs, 0600); chown(vcsa, 0, id); @@ -628,8 +629,8 @@ static void termios_final(struct options *op, struct termios *tp, struct chardat tp->c_cflag |= CS7; break; } - /* Account for upper case without lower case. */ + /* Account for upper case without lower case. */ #ifdef HANDLE_ALLCAPS if (cp->capslock) { tp->c_iflag |= IUCLC; diff --git a/networking/traceroute.c b/networking/traceroute.c index 47775aa8a..25c6569bb 100644 --- a/networking/traceroute.c +++ b/networking/traceroute.c @@ -1040,10 +1040,8 @@ traceroute_main(int argc, char *argv[]) bb_show_usage(); } - /* Insure the socket fds won't be 0, 1 or 2 */ - do n = xopen(bb_dev_null, O_RDONLY); while (n < 2); - while (n > 2) - close(n--); + /* Ensure the socket fds won't be 0, 1 or 2 */ + bb_sanitize_stdio(); s = xsocket(AF_INET, SOCK_RAW, IPPROTO_ICMP); diff --git a/networking/udhcp/common.c b/networking/udhcp/common.c index 3e916f422..3704ba71a 100644 --- a/networking/udhcp/common.c +++ b/networking/udhcp/common.c @@ -22,20 +22,6 @@ long uptime(void) return info.uptime; } -/* - * This function makes sure our first socket calls - * aren't going to fd 1 (printf badness...) and are - * not later closed by daemon() - */ -static inline void sanitize_fds(void) -{ - int fd = xopen(bb_dev_null, O_RDWR); - while (fd < 3) - fd = dup(fd); - close(fd); -} - - void udhcp_background(const char *pidfile) { #ifdef __uClinux__ @@ -57,7 +43,7 @@ void udhcp_start_log_and_pid(const char *pidfile) int pid_fd; /* Make sure our syslog fd isn't overwritten */ - sanitize_fds(); + bb_sanitize_stdio(); /* do some other misc startup stuff while we are here to save bytes */ pid_fd = pidfile_acquire(pidfile); -- 2.25.1