aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2020-03-17 12:01:28 +0000
committerThomas Adam <thomas@xteddy.org>2020-03-17 12:01:28 +0000
commit0610f66fa9c8e5ac46e796a2dbc89bb1b369d84f (patch)
tree5a1203bc453a07be05a2c652e635570adb8ee672
parent71eb965dd9ef1e511dfb6d2b24196cca550e1284 (diff)
parent115bb33257ece9eec1c890cc04683227678a895f (diff)
downloadrtmux-0610f66fa9c8e5ac46e796a2dbc89bb1b369d84f.tar.gz
rtmux-0610f66fa9c8e5ac46e796a2dbc89bb1b369d84f.tar.bz2
rtmux-0610f66fa9c8e5ac46e796a2dbc89bb1b369d84f.zip
Merge branch 'obsd-master'
-rw-r--r--cmd-set-option.c7
-rw-r--r--server-client.c4
-rw-r--r--spawn.c2
-rw-r--r--tmux.c6
-rw-r--r--tmux.h2
5 files changed, 15 insertions, 6 deletions
diff --git a/cmd-set-option.c b/cmd-set-option.c
index 23b45230..2709dcdc 100644
--- a/cmd-set-option.c
+++ b/cmd-set-option.c
@@ -309,6 +309,13 @@ cmd_set_option_set(struct cmd *self, struct cmdq_item *item, struct options *oo,
old = xstrdup(options_get_string(oo, oe->name));
options_set_string(oo, oe->name, append, "%s", value);
new = options_get_string(oo, oe->name);
+ if (strcmp(oe->name, "default-shell") == 0 &&
+ !checkshell(new)) {
+ options_set_string(oo, oe->name, 0, "%s", old);
+ free(old);
+ cmdq_error(item, "not a suitable shell: %s", value);
+ return (-1);
+ }
if (oe->pattern != NULL && fnmatch(oe->pattern, new, 0) != 0) {
options_set_string(oo, oe->name, 0, "%s", old);
free(old);
diff --git a/server-client.c b/server-client.c
index 17a1c9de..fd31eeee 100644
--- a/server-client.c
+++ b/server-client.c
@@ -398,6 +398,8 @@ server_client_exec(struct client *c, const char *cmd)
shell = options_get_string(s->options, "default-shell");
else
shell = options_get_string(global_s_options, "default-shell");
+ if (!checkshell(shell))
+ shell = _PATH_BSHELL;
shellsize = strlen(shell) + 1;
msg = xmalloc(cmdsize + shellsize);
@@ -2011,7 +2013,7 @@ server_client_dispatch_shell(struct client *c)
const char *shell;
shell = options_get_string(global_s_options, "default-shell");
- if (*shell == '\0' || areshell(shell))
+ if (!checkshell(shell))
shell = _PATH_BSHELL;
proc_send(c->peer, MSG_SHELL, -1, shell, strlen(shell) + 1);
diff --git a/spawn.c b/spawn.c
index ee19cb9d..88c59100 100644
--- a/spawn.c
+++ b/spawn.c
@@ -318,7 +318,7 @@ spawn_pane(struct spawn_context *sc, char **cause)
/* Then the shell. If respawning, use the old one. */
if (~sc->flags & SPAWN_RESPAWN) {
tmp = options_get_string(s->options, "default-shell");
- if (*tmp == '\0' || areshell(tmp))
+ if (!checkshell(tmp))
tmp = _PATH_BSHELL;
free(new_wp->shell);
new_wp->shell = xstrdup(tmp);
diff --git a/tmux.c b/tmux.c
index e296a13a..46a9a656 100644
--- a/tmux.c
+++ b/tmux.c
@@ -46,8 +46,8 @@ const char *shell_command;
static __dead void usage(void);
static char *make_label(const char *, char **);
+static int areshell(const char *);
static const char *getshell(void);
-static int checkshell(const char *);
static __dead void
usage(void)
@@ -76,7 +76,7 @@ getshell(void)
return (_PATH_BSHELL);
}
-static int
+int
checkshell(const char *shell)
{
if (shell == NULL || *shell != '/')
@@ -88,7 +88,7 @@ checkshell(const char *shell)
return (1);
}
-int
+static int
areshell(const char *shell)
{
const char *progname, *ptr;
diff --git a/tmux.h b/tmux.h
index 6f725ca7..633a101b 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1773,7 +1773,7 @@ extern const char *socket_path;
extern const char *shell_command;
extern int ptm_fd;
extern const char *shell_command;
-int areshell(const char *);
+int checkshell(const char *);
void setblocking(int, int);
const char *find_cwd(void);
const char *find_home(void);