summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm@openbsd.org>2013-10-20 17:28:43 +0000
committernicm <nicm@openbsd.org>2013-10-20 17:28:43 +0000
commit8f73cf4eed9c7ae1718976b2986f09d01ae1cd35 (patch)
tree75e4bd80f6aada859b9662ee9a7e0468891815ce
parentInformational message on unpack start (diff)
downloadwireguard-openbsd-8f73cf4eed9c7ae1718976b2986f09d01ae1cd35.tar.xz
wireguard-openbsd-8f73cf4eed9c7ae1718976b2986f09d01ae1cd35.zip
Do not run any command line command from the client which starts the
server until after the configuration file completes. This prevents it racing against run-shell or if-shell in .tmux.conf that run in the background.
-rw-r--r--usr.bin/tmux/cfg.c17
-rw-r--r--usr.bin/tmux/server-client.c11
-rw-r--r--usr.bin/tmux/server.c5
-rw-r--r--usr.bin/tmux/tmux.h3
4 files changed, 29 insertions, 7 deletions
diff --git a/usr.bin/tmux/cfg.c b/usr.bin/tmux/cfg.c
index fc7bbfe9011..4521e7eb336 100644
--- a/usr.bin/tmux/cfg.c
+++ b/usr.bin/tmux/cfg.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cfg.c,v 1.29 2013/03/25 10:06:13 nicm Exp $ */
+/* $OpenBSD: cfg.c,v 1.30 2013/10/20 17:28:43 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -31,6 +31,7 @@ struct cmd_q *cfg_cmd_q;
int cfg_finished;
int cfg_references;
struct causelist cfg_causes;
+struct client *cfg_client;
int
load_cfg(const char *path, struct cmd_q *cmdq, char **cause)
@@ -127,6 +128,20 @@ cfg_default_done(unused struct cmd_q *cmdq)
cmdq_free(cfg_cmd_q);
cfg_cmd_q = NULL;
+
+ if (cfg_client != NULL) {
+ /*
+ * The client command queue starts with client_exit set to 1 so
+ * only continue if not empty (that is, we have been delayed
+ * during configuration parsing for long enough that the
+ * MSG_COMMAND has arrived), else the client will exit before
+ * the MSG_COMMAND which might tell it not to.
+ */
+ if (!TAILQ_EMPTY(&cfg_client->cmdq->queue))
+ cmdq_continue(cfg_client->cmdq);
+ cfg_client->references--;
+ cfg_client = NULL;
+ }
}
void
diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c
index a1c41af0374..c27dcdf48fe 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.112 2013/10/11 08:07:12 nicm Exp $ */
+/* $OpenBSD: server-client.c,v 1.113 2013/10/20 17:28:43 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -155,8 +155,8 @@ server_client_lost(struct client *c)
free(c->ttyname);
free(c->term);
- evbuffer_free (c->stdin_data);
- evbuffer_free (c->stdout_data);
+ evbuffer_free(c->stdin_data);
+ evbuffer_free(c->stdout_data);
if (c->stderr_data != c->stdout_data)
evbuffer_free (c->stderr_data);
@@ -932,7 +932,10 @@ server_client_msg_command(struct client *c, struct imsg *imsg)
}
cmd_free_argv(argc, argv);
- cmdq_run(c->cmdq, cmdlist);
+ if (c != cfg_client || cfg_finished)
+ cmdq_run(c->cmdq, cmdlist);
+ else
+ cmdq_append(c->cmdq, cmdlist);
cmd_list_free(cmdlist);
return;
diff --git a/usr.bin/tmux/server.c b/usr.bin/tmux/server.c
index 96ac0cb671d..ce7ea727e65 100644
--- a/usr.bin/tmux/server.c
+++ b/usr.bin/tmux/server.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server.c,v 1.110 2013/04/24 10:01:32 nicm Exp $ */
+/* $OpenBSD: server.c,v 1.111 2013/10/20 17:28:43 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -168,6 +168,9 @@ server_start(int lockfd, char *lockfile)
cfg_finished = 0;
cfg_references = 1;
ARRAY_INIT(&cfg_causes);
+ cfg_client = ARRAY_FIRST(&clients);
+ if (cfg_client != NULL)
+ cfg_client->references++;
if (access(TMUX_CONF, R_OK) == 0) {
if (load_cfg(TMUX_CONF, cfg_cmd_q, &cause) == -1) {
diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index 2993b2cc7e8..e05ade7eebd 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.430 2013/10/10 12:39:25 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.431 2013/10/20 17:28:43 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -1510,6 +1510,7 @@ extern struct cmd_q *cfg_cmd_q;
extern int cfg_finished;
extern int cfg_references;
extern struct causelist cfg_causes;
+extern struct client *cfg_client;
int load_cfg(const char *, struct cmd_q *, char **);
void cfg_default_done(struct cmd_q *);
void cfg_show_causes(struct session *);