summaryrefslogtreecommitdiff
path: root/usr.bin/tmux
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2015-07-13 15:49:32 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2015-07-13 15:49:32 +0000
commita5b926d23cb47daedc71de1868615af012f8297c (patch)
treeada23f65712f9912e8e58070ed8b10bae213a423 /usr.bin/tmux
parentc1bacbefc9db845116d552124fdda8aa2dc85bdb (diff)
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.
Diffstat (limited to 'usr.bin/tmux')
-rw-r--r--usr.bin/tmux/server-client.c7
-rw-r--r--usr.bin/tmux/tmux.h4
-rw-r--r--usr.bin/tmux/tty.c11
3 files changed, 14 insertions, 8 deletions
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 <nicm@users.sourceforge.net>
@@ -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 <nicm@users.sourceforge.net>
@@ -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 <nicm@users.sourceforge.net>
@@ -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