Pass current directory as a string rather than a file descriptor because
authornicm <nicm@openbsd.org>
Sun, 18 Oct 2015 20:42:42 +0000 (20:42 +0000)
committernicm <nicm@openbsd.org>
Sun, 18 Oct 2015 20:42:42 +0000 (20:42 +0000)
pledge doesn't let us pass directory file descriptors.

usr.bin/tmux/client.c
usr.bin/tmux/server-client.c
usr.bin/tmux/tmux.h

index dca2ced..eef918d 100644 (file)
@@ -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 <nicm@users.sourceforge.net>
@@ -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");
index 332071d..fdf0d37 100644 (file)
@@ -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 <nicm@users.sourceforge.net>
@@ -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)
index 0b67077..61ce382 100644 (file)
@@ -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 <nicm@users.sourceforge.net>
@@ -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,