diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2017-01-23 10:09:44 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2017-01-23 10:09:44 +0000 |
commit | ced88da0dc83010e18f769ef688c6a47066f388c (patch) | |
tree | 641ae7b6f3a38e3108f664a31129223eb2cb9b04 | |
parent | 265625d34efc350951296863b5c8e155153434f6 (diff) |
Open /dev/ptm before pledge() and save it to be used for PTMGET later
(this means inlining forkpty()).
ok deraadt
-rw-r--r-- | usr.bin/tmux/Makefile | 3 | ||||
-rw-r--r-- | usr.bin/tmux/client.c | 4 | ||||
-rw-r--r-- | usr.bin/tmux/pty.c | 67 | ||||
-rw-r--r-- | usr.bin/tmux/tmux.c | 5 | ||||
-rw-r--r-- | usr.bin/tmux/tmux.h | 7 | ||||
-rw-r--r-- | usr.bin/tmux/window.c | 4 |
6 files changed, 84 insertions, 6 deletions
diff --git a/usr.bin/tmux/Makefile b/usr.bin/tmux/Makefile index 276440669b6..9c24268a39c 100644 --- a/usr.bin/tmux/Makefile +++ b/usr.bin/tmux/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.83 2015/12/08 01:10:31 nicm Exp $ +# $OpenBSD: Makefile,v 1.84 2017/01/23 10:09:43 nicm Exp $ PROG= tmux SRCS= alerts.c \ @@ -97,6 +97,7 @@ SRCS= alerts.c \ paste.c \ proc.c \ procname.c \ + pty.c \ resize.c \ screen-redraw.c \ screen-write.c \ diff --git a/usr.bin/tmux/client.c b/usr.bin/tmux/client.c index 601f4e9c33c..bc617d545b9 100644 --- a/usr.bin/tmux/client.c +++ b/usr.bin/tmux/client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: client.c,v 1.118 2017/01/20 14:02:33 nicm Exp $ */ +/* $OpenBSD: client.c,v 1.119 2017/01/23 10:09:43 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> @@ -303,6 +303,8 @@ client_main(struct event_base *base, int argc, char **argv, int flags, fatal("pledge failed"); /* Free stuff that is not used in the client. */ + if (ptm_fd != -1) + close(ptm_fd); options_free(global_options); options_free(global_s_options); options_free(global_w_options); diff --git a/usr.bin/tmux/pty.c b/usr.bin/tmux/pty.c new file mode 100644 index 00000000000..108aaa18b9e --- /dev/null +++ b/usr.bin/tmux/pty.c @@ -0,0 +1,67 @@ +/* $OpenBSD: pty.c,v 1.1 2017/01/23 10:09:43 nicm Exp $ */ + +/* + * Copyright (c) 2017 Nicholas Marriott <nicholas.marriott@gmail.com> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/types.h> +#include <sys/ioctl.h> +#include <sys/time.h> +#include <sys/tty.h> + +#include <fcntl.h> +#include <string.h> +#include <termios.h> +#include <unistd.h> +#include <util.h> + +int pty_open(int *); +pid_t pty_fork(int, int *, char *, size_t, struct winsize *); + +int +pty_open(int *fd) +{ + *fd = open(PATH_PTMDEV, O_RDWR|O_CLOEXEC); + if (*fd < 0) + return (-1); + return (0); +} + +pid_t +pty_fork(int ptmfd, int *fd, char *name, size_t namelen, struct winsize *ws) +{ + struct ptmget ptm; + pid_t pid; + + if ((ioctl(ptmfd, PTMGET, &ptm) == -1)) + return (-1); + + strlcpy(name, ptm.sn, namelen); + ioctl(ptm.sfd, TIOCSWINSZ, ws); + + switch (pid = fork()) { + case -1: + close(ptm.cfd); + close(ptm.sfd); + return (-1); + case 0: + close(ptm.cfd); + login_tty(ptm.sfd); + return (0); + } + *fd = ptm.cfd; + close(ptm.sfd); + return (pid); +} diff --git a/usr.bin/tmux/tmux.c b/usr.bin/tmux/tmux.c index 5e4b4d7f741..ccc0a0795bb 100644 --- a/usr.bin/tmux/tmux.c +++ b/usr.bin/tmux/tmux.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.c,v 1.175 2017/01/15 20:48:41 nicm Exp $ */ +/* $OpenBSD: tmux.c,v 1.176 2017/01/23 10:09:43 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> @@ -43,6 +43,7 @@ struct hooks *global_hooks; struct timeval start_time; const char *socket_path; +int ptm_fd = -1; static __dead void usage(void); static char *make_label(const char *); @@ -258,6 +259,8 @@ main(int argc, char **argv) if (shellcmd != NULL && argc != 0) usage(); + if (pty_open(&ptm_fd) != 0) + errx(1, "open(\"/dev/ptm\""); if (pledge("stdio rpath wpath cpath flock fattr unix getpw sendfd " "recvfd proc exec tty ps", NULL) != 0) err(1, "pledge"); diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index 143c8e41793..68dd635f522 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.701 2017/01/18 10:08:05 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.702 2017/01/23 10:09:43 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> @@ -1501,6 +1501,7 @@ extern struct options *global_w_options; extern struct environ *global_environ; extern struct timeval start_time; extern const char *socket_path; +extern int ptm_fd; int areshell(const char *); void setblocking(int, int); const char *find_home(void); @@ -2329,4 +2330,8 @@ void style_apply_update(struct grid_cell *, struct options *, int style_equal(const struct grid_cell *, const struct grid_cell *); +/* pty.c */ +int pty_open(int *); +pid_t pty_fork(int, int *, char *, size_t, struct winsize *); + #endif /* TMUX_H */ diff --git a/usr.bin/tmux/window.c b/usr.bin/tmux/window.c index a72c95fd4ba..46b1b4b9ff2 100644 --- a/usr.bin/tmux/window.c +++ b/usr.bin/tmux/window.c @@ -1,4 +1,4 @@ -/* $OpenBSD: window.c,v 1.180 2017/01/12 10:15:55 nicm Exp $ */ +/* $OpenBSD: window.c,v 1.181 2017/01/23 10:09:43 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> @@ -886,7 +886,7 @@ window_pane_spawn(struct window_pane *wp, int argc, char **argv, ws.ws_col = screen_size_x(&wp->base); ws.ws_row = screen_size_y(&wp->base); - switch (wp->pid = forkpty(&wp->fd, wp->tty, NULL, &ws)) { + switch (wp->pid = pty_fork(ptm_fd, &wp->fd, wp->tty, sizeof wp->tty, &ws)) { case -1: wp->fd = -1; xasprintf(cause, "%s: %s", cmd, strerror(errno)); |