From 3c5719159325421b5e99d87dfc3891dd4cd727d0 Mon Sep 17 00:00:00 2001 From: nicm Date: Sun, 18 Oct 2015 20:42:42 +0000 Subject: [PATCH] Pass current directory as a string rather than a file descriptor because pledge doesn't let us pass directory file descriptors. --- usr.bin/tmux/client.c | 20 ++++++++++---------- usr.bin/tmux/server-client.c | 9 +++++---- usr.bin/tmux/tmux.h | 5 +++-- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/usr.bin/tmux/client.c b/usr.bin/tmux/client.c index dca2cedbb16..eef918d3ba3 100644 --- a/usr.bin/tmux/client.c +++ b/usr.bin/tmux/client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: client.c,v 1.97 2015/10/17 18:30:43 nicm Exp $ */ +/* $OpenBSD: client.c,v 1.98 2015/10/18 20:42:42 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -55,7 +55,7 @@ int client_attached; __dead void client_exec(const char *); int client_get_lock(char *); int client_connect(struct event_base *, char *, int); -void client_send_identify(const char *, int); +void client_send_identify(const char *, const char *); int client_write_one(enum msgtype, int, const void *, size_t); int client_write_server(enum msgtype, const void *, size_t); void client_update_event(void); @@ -214,11 +214,11 @@ client_main(struct event_base *base, int argc, char **argv, int flags) struct cmd *cmd; struct cmd_list *cmdlist; struct msg_command_data *data; - int cmdflags, fd, i, cwd; - const char* ttynam; + int cmdflags, fd, i; + const char *ttynam, *cwd; pid_t ppid; enum msgtype msg; - char *cause; + char *cause, path[PATH_MAX]; struct termios tio, saved_tio; size_t size; @@ -275,8 +275,8 @@ client_main(struct event_base *base, int argc, char **argv, int flags) } /* Save these before pledge(). */ - if ((cwd = open(".", O_RDONLY)) == -1) - cwd = open("/", O_RDONLY); + if ((cwd = getcwd(path, sizeof path)) == NULL) + cwd = "/"; if ((ttynam = ttyname(STDIN_FILENO)) == NULL) ttynam = ""; @@ -325,7 +325,7 @@ client_main(struct event_base *base, int argc, char **argv, int flags) } /* Send identify messages. */ - client_send_identify(ttynam, cwd); /* closes cwd */ + client_send_identify(ttynam, cwd); /* Send first command. */ if (msg == MSG_COMMAND) { @@ -380,7 +380,7 @@ client_main(struct event_base *base, int argc, char **argv, int flags) /* Send identify messages to server. */ void -client_send_identify(const char *ttynam, int cwd) +client_send_identify(const char *ttynam, const char *cwd) { const char *s; char **ss; @@ -395,7 +395,7 @@ client_send_identify(const char *ttynam, int cwd) client_write_one(MSG_IDENTIFY_TERM, -1, s, strlen(s) + 1); client_write_one(MSG_IDENTIFY_TTYNAME, -1, ttynam, strlen(ttynam) + 1); - client_write_one(MSG_IDENTIFY_CWD, cwd, NULL, 0); + client_write_one(MSG_IDENTIFY_CWD, -1, cwd, strlen(cwd) + 1); if ((fd = dup(STDIN_FILENO)) == -1) fatal("dup failed"); diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c index 332071d2b1c..fdf0d378776 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.154 2015/09/16 22:24:54 nicm Exp $ */ +/* $OpenBSD: server-client.c,v 1.155 2015/10/18 20:42:43 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -1166,9 +1166,10 @@ server_client_msg_identify(struct client *c, struct imsg *imsg) c->ttyname = xstrdup(data); break; case MSG_IDENTIFY_CWD: - if (datalen != 0) - fatalx("bad MSG_IDENTIFY_CWD size"); - c->cwd = imsg->fd; + if (datalen == 0 || data[datalen - 1] != '\0') + fatalx("bad MSG_IDENTIFY_CWD string"); + if ((c->cwd = open(data, O_RDONLY)) == -1) + c->cwd = open("/", O_RDONLY); break; case MSG_IDENTIFY_STDIN: if (datalen != 0) diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index 0b670771ea9..61ce3820da8 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.562 2015/09/25 15:53:07 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.563 2015/10/18 20:42:42 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -395,11 +395,12 @@ enum msgtype { MSG_IDENTIFY_FLAGS = 100, MSG_IDENTIFY_TERM, MSG_IDENTIFY_TTYNAME, - MSG_IDENTIFY_CWD, + MSG_IDENTIFY_OLDCWD, /* unused */ MSG_IDENTIFY_STDIN, MSG_IDENTIFY_ENVIRON, MSG_IDENTIFY_DONE, MSG_IDENTIFY_CLIENTPID, + MSG_IDENTIFY_CWD, MSG_COMMAND = 200, MSG_DETACH, -- 2.20.1