X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/89e97516fedf1d0a7fe9c569bb569fa7ea872afa..132e0cadc7f2a1fe9511d91fbccba41ed95c41d1:/unix/uxpty.c diff --git a/unix/uxpty.c b/unix/uxpty.c index e47f7981..5de43a3a 100644 --- a/unix/uxpty.c +++ b/unix/uxpty.c @@ -260,7 +260,8 @@ static void cleanup_utmp(void) static void sigchld_handler(int signum) { - write(pty_signal_pipe[1], "x", 1); + if (write(pty_signal_pipe[1], "x", 1) <= 0) + /* not much we can do about it */; } #ifndef OMIT_UTMP @@ -277,7 +278,7 @@ static int pty_open_slave(Pty pty) { if (pty->slave_fd < 0) { pty->slave_fd = open(pty->name, O_RDWR); - fcntl(pty->slave_fd, F_SETFD, FD_CLOEXEC); + cloexec(pty->slave_fd); } return pty->slave_fd; @@ -309,7 +310,7 @@ static void pty_open_master(Pty pty) strcpy(pty->name, master_name); pty->name[5] = 't'; /* /dev/ptyXX -> /dev/ttyXX */ - fcntl(pty->master_fd, F_SETFD, FD_CLOEXEC); + cloexec(pty->master_fd); if (pty_open_slave(pty) >= 0 && access(pty->name, R_OK | W_OK) == 0) @@ -350,7 +351,7 @@ static void pty_open_master(Pty pty) exit(1); } - fcntl(pty->master_fd, F_SETFD, FD_CLOEXEC); + cloexec(pty->master_fd); pty->name[FILENAME_MAX-1] = '\0'; strncpy(pty->name, ptsname(pty->master_fd), FILENAME_MAX-1); @@ -360,8 +361,10 @@ static void pty_open_master(Pty pty) /* * Set the pty master into non-blocking mode. */ - int i = 1; - ioctl(pty->master_fd, FIONBIO, &i); + int fl; + fl = fcntl(pty->master_fd, F_GETFL); + if (fl != -1 && !(fl & O_NONBLOCK)) + fcntl(pty->master_fd, F_SETFL, fl | O_NONBLOCK); } if (!ptys_by_fd) @@ -414,6 +417,8 @@ void pty_pre_init(void) perror("pterm: pipe"); exit(1); } + cloexec(pipefd[0]); + cloexec(pipefd[1]); pid = fork(); if (pid < 0) { perror("pterm: fork"); @@ -629,7 +634,9 @@ int pty_select_result(int fd, int event) int status; char c[1]; - read(pty_signal_pipe[0], c, 1); /* ignore its value; it'll be `x' */ + if (read(pty_signal_pipe[0], c, 1) <= 0) + /* ignore error */; + /* ignore its value; it'll be `x' */ do { pid = waitpid(-1, &status, WNOHANG); @@ -755,7 +762,6 @@ static const char *pty_init(void *frontend, void **backend_handle, Config *cfg, } if (pid == 0) { - int i; /* * We are the child. */ @@ -771,18 +777,16 @@ static const char *pty_init(void *frontend, void **backend_handle, Config *cfg, dup2(slavefd, 0); dup2(slavefd, 1); dup2(slavefd, 2); + close(slavefd); setsid(); #ifdef TIOCSCTTY - ioctl(slavefd, TIOCSCTTY, 1); + ioctl(0, TIOCSCTTY, 1); #endif pgrp = getpid(); - tcsetpgrp(slavefd, pgrp); + tcsetpgrp(0, pgrp); setpgid(pgrp, pgrp); close(open(pty->name, O_WRONLY, 0)); setpgid(pgrp, pgrp); - /* Close everything _else_, for tidiness. */ - for (i = 3; i < 1024; i++) - close(i); { char *term_env_var = dupprintf("TERM=%s", cfg->termtype); putenv(term_env_var); @@ -863,9 +867,13 @@ static const char *pty_init(void *frontend, void **backend_handle, Config *cfg, add234(ptys_by_pid, pty); } - if (pty_signal_pipe[0] < 0 && pipe(pty_signal_pipe) < 0) { - perror("pipe"); - exit(1); + if (pty_signal_pipe[0] < 0) { + if (pipe(pty_signal_pipe) < 0) { + perror("pipe"); + exit(1); + } + cloexec(pty_signal_pipe[0]); + cloexec(pty_signal_pipe[1]); } pty_uxsel_setup(pty); @@ -1082,5 +1090,7 @@ Backend pty_backend = { pty_provide_logctx, pty_unthrottle, pty_cfg_info, - 1 + "pty", + -1, + 0 };