From a5b926d23cb47daedc71de1868615af012f8297c Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 13 Jul 2015 15:49:32 +0000 Subject: Initialize cwd fd to -1 so that we don't close fd 0 if the client is destroyed before it is changed. Also allow ttyname() to fail. Fixes problems when running out of file descriptors reported by Bruno Sutic. --- usr.bin/tmux/server-client.c | 7 ++++--- usr.bin/tmux/tmux.h | 4 ++-- usr.bin/tmux/tty.c | 11 ++++++++--- 3 files changed, 14 insertions(+), 8 deletions(-) (limited to 'usr.bin/tmux') diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c index a4961243b75..919c5a8e1a3 100644 --- a/usr.bin/tmux/server-client.c +++ b/usr.bin/tmux/server-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-client.c,v 1.143 2015/06/14 10:07:44 nicm Exp $ */ +/* $OpenBSD: server-client.c,v 1.144 2015/07/13 15:49:31 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -96,6 +96,8 @@ server_client_create(int fd) environ_init(&c->environ); + c->cwd = -1; + c->cmdq = cmdq_new(c); c->cmdq->client_exit = 1; @@ -1253,12 +1255,11 @@ server_client_msg_identify(struct client *c, struct imsg *imsg) if (c->fd == -1) return; - if (!isatty(c->fd)) { + if (tty_init(&c->tty, c, c->fd, c->term) != 0) { close(c->fd); c->fd = -1; return; } - tty_init(&c->tty, c, c->fd, c->term); if (c->flags & CLIENT_UTF8) c->tty.flags |= TTY_UTF8; if (c->flags & CLIENT_256COLOURS) diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index 91f72bcbf15..36b72676042 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.526 2015/06/17 16:50:28 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.527 2015/07/13 15:49:31 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1600,7 +1600,7 @@ void tty_putcode_ptr2(struct tty *, enum tty_code_code, const void *, void tty_puts(struct tty *, const char *); void tty_putc(struct tty *, u_char); void tty_putn(struct tty *, const void *, size_t, u_int); -void tty_init(struct tty *, struct client *, int, char *); +int tty_init(struct tty *, struct client *, int, char *); int tty_resize(struct tty *); int tty_set_size(struct tty *, u_int, u_int); void tty_set_class(struct tty *, u_int); diff --git a/usr.bin/tmux/tty.c b/usr.bin/tmux/tty.c index d13a2445ab9..09dc381626d 100644 --- a/usr.bin/tmux/tty.c +++ b/usr.bin/tmux/tty.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty.c,v 1.183 2015/05/19 08:48:37 nicm Exp $ */ +/* $OpenBSD: tty.c,v 1.184 2015/07/13 15:49:31 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -59,11 +59,14 @@ void tty_default_colours(struct grid_cell *, const struct window_pane *); #define tty_pane_full_width(tty, ctx) \ ((ctx)->xoff == 0 && screen_size_x((ctx)->wp->screen) >= (tty)->sx) -void +int tty_init(struct tty *tty, struct client *c, int fd, char *term) { char *path; + if (!isatty(fd)) + return (-1); + memset(tty, 0, sizeof *tty); tty->log_fd = -1; @@ -75,13 +78,15 @@ tty_init(struct tty *tty, struct client *c, int fd, char *term) tty->client = c; if ((path = ttyname(fd)) == NULL) - fatalx("ttyname failed"); + return (-1); tty->path = xstrdup(path); tty->cstyle = 0; tty->ccolour = xstrdup(""); tty->flags = 0; tty->term_flags = 0; + + return (0); } int -- cgit v1.2.3