aboutsummaryrefslogtreecommitdiff
path: root/tty.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2009-09-23 06:05:02 +0000
committerNicholas Marriott <nicm@openbsd.org>2009-09-23 06:05:02 +0000
commit64caf59e84c3ae1c06773bb8ec91165eeedabe6d (patch)
tree0f10d742fde77ea6c07b28a3675caaad14595db8 /tty.c
parent0a9005678da04b1e7783d26b02041e3973f26127 (diff)
downloadrtmux-64caf59e84c3ae1c06773bb8ec91165eeedabe6d.tar.gz
rtmux-64caf59e84c3ae1c06773bb8ec91165eeedabe6d.tar.bz2
rtmux-64caf59e84c3ae1c06773bb8ec91165eeedabe6d.zip
Don't attempt to open() the tty path, rely on the client sending its stdin fd
with imsg and fatal if it doesn't, then set the FD_CLOEXEC flag in tty_init instead of tty_open to prevent them leaking into child processes if any are created between the two calls. This bumps the protocol version, so the tmux server should be killed before upgrading.
Diffstat (limited to 'tty.c')
-rw-r--r--tty.c46
1 files changed, 24 insertions, 22 deletions
diff --git a/tty.c b/tty.c
index b0810219..574e9a7b 100644
--- a/tty.c
+++ b/tty.c
@@ -44,16 +44,31 @@ void tty_cell(struct tty *,
const struct grid_cell *, const struct grid_utf8 *);
void
-tty_init(struct tty *tty, int fd, char *path, char *term)
+tty_init(struct tty *tty, int fd, char *term)
{
- tty->path = xstrdup(path);
- tty->fd = fd;
+ int mode;
+ char *path;
+
+ memset(tty, 0, sizeof *tty);
tty->log_fd = -1;
if (term == NULL || *term == '\0')
tty->termname = xstrdup("unknown");
else
tty->termname = xstrdup(term);
+
+ if ((mode = fcntl(fd, F_GETFL)) == -1)
+ fatal("fcntl failed");
+ if (fcntl(fd, F_SETFL, mode|O_NONBLOCK) == -1)
+ fatal("fcntl failed");
+ if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1)
+ fatal("fcntl failed");
+ tty->fd = fd;
+
+ if ((path = ttyname(fd)) == NULL)
+ fatalx("ttyname failed");
+ tty->path = xstrdup(path);
+
tty->flags = 0;
tty->term_flags = 0;
}
@@ -61,28 +76,15 @@ tty_init(struct tty *tty, int fd, char *path, char *term)
int
tty_open(struct tty *tty, const char *overrides, char **cause)
{
- int mode;
+ int fd;
- if (tty->fd == -1) {
- tty->fd = open(tty->path, O_RDWR|O_NONBLOCK);
- if (tty->fd == -1) {
- xasprintf(cause, "%s: %s", tty->path, strerror(errno));
- return (-1);
- }
+ if (debug_level > 3) {
+ fd = open("tmux.out", O_WRONLY|O_CREAT|O_TRUNC, 0644);
+ if (fd != -1 && fcntl(fd, F_SETFD, FD_CLOEXEC) == -1)
+ fatal("fcntl failed");
+ tty->log_fd = fd;
}
- if ((mode = fcntl(tty->fd, F_GETFL)) == -1)
- fatal("fcntl failed");
- if (fcntl(tty->fd, F_SETFL, mode|O_NONBLOCK) == -1)
- fatal("fcntl failed");
- if (fcntl(tty->fd, F_SETFD, FD_CLOEXEC) == -1)
- fatal("fcntl failed");
-
- if (debug_level > 3)
- tty->log_fd = open("tmux.out", O_WRONLY|O_CREAT|O_TRUNC, 0644);
- else
- tty->log_fd = -1;
-
tty->term = tty_term_find(tty->termname, tty->fd, overrides, cause);
if (tty->term == NULL) {
tty_close(tty);