use bb_sanitize_stdio() where appropriate

This commit is contained in:
Denis Vlasenko 2007-01-27 22:21:12 +00:00
parent cd75a96f0f
commit e06bed30cf
5 changed files with 26 additions and 35 deletions

View File

@ -14,16 +14,18 @@
int nohup_main(int argc, char **argv) int nohup_main(int argc, char **argv)
{ {
int temp, nullfd; int nullfd;
char *nohupout, *home = NULL; const char *nohupout;
char *home = NULL;
xfunc_error_retval = 127; 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); nullfd = xopen(bb_dev_null, O_WRONLY|O_APPEND);
/* If stdin is a tty, detach from it. */ /* 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"; nohupout = "nohup.out";
/* Redirect stdout to nohup.out, either in "." or in "$HOME". */ /* 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); } 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. * Else redirect to /dev/null.
*/ */
temp = isatty(STDERR_FILENO); if (isatty(STDERR_FILENO)) {
if (temp) bb_error_msg("appending to %s", nohupout); bb_error_msg("appending to %s", nohupout);
dup2(temp ? STDOUT_FILENO : nullfd, STDERR_FILENO); dup2(STDOUT_FILENO, STDERR_FILENO);
close(nullfd); } else dup2(nullfd, STDERR_FILENO);
signal (SIGHUP, SIG_IGN);
execvp(argv[1],argv+1); if (nullfd > 2)
if (00 && ENABLE_FEATURE_CLEAN_UP && home) free(nohupout); 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]); bb_perror_msg_and_die("%s", argv[1]);
} }

View File

@ -518,7 +518,7 @@ void bb_sanitize_stdio_maybe_daemonize(int daemonize)
int fd; int fd;
/* Mega-paranoid */ /* Mega-paranoid */
fd = xopen(bb_dev_null, O_RDWR); 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 */ fd = dup(fd); /* have 0,1,2 open at least to /dev/null */
if (daemonize) { if (daemonize) {
pid_t pid = fork(); pid_t pid = fork();

View File

@ -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) 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 */ /* 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, "vcsa");
strcpy(vcsa + 4, tty + 3); 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); chown(vcs, 0, id);
chmod(vcs, 0600); chmod(vcs, 0600);
chown(vcsa, 0, id); chown(vcsa, 0, id);
@ -628,8 +629,8 @@ static void termios_final(struct options *op, struct termios *tp, struct chardat
tp->c_cflag |= CS7; tp->c_cflag |= CS7;
break; break;
} }
/* Account for upper case without lower case. */
/* Account for upper case without lower case. */
#ifdef HANDLE_ALLCAPS #ifdef HANDLE_ALLCAPS
if (cp->capslock) { if (cp->capslock) {
tp->c_iflag |= IUCLC; tp->c_iflag |= IUCLC;

View File

@ -1040,10 +1040,8 @@ traceroute_main(int argc, char *argv[])
bb_show_usage(); bb_show_usage();
} }
/* Insure the socket fds won't be 0, 1 or 2 */ /* Ensure the socket fds won't be 0, 1 or 2 */
do n = xopen(bb_dev_null, O_RDONLY); while (n < 2); bb_sanitize_stdio();
while (n > 2)
close(n--);
s = xsocket(AF_INET, SOCK_RAW, IPPROTO_ICMP); s = xsocket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

View File

@ -22,20 +22,6 @@ long uptime(void)
return info.uptime; 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) void udhcp_background(const char *pidfile)
{ {
#ifdef __uClinux__ #ifdef __uClinux__
@ -57,7 +43,7 @@ void udhcp_start_log_and_pid(const char *pidfile)
int pid_fd; int pid_fd;
/* Make sure our syslog fd isn't overwritten */ /* 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 */ /* do some other misc startup stuff while we are here to save bytes */
pid_fd = pidfile_acquire(pidfile); pid_fd = pidfile_acquire(pidfile);