aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2021-07-06 10:01:22 +0100
committerThomas Adam <thomas@xteddy.org>2021-07-06 10:01:22 +0100
commited575182e3018d81a0b3b81bde4a64bad967c298 (patch)
tree833ec8dbcfbdf27ee247af05c3eae6887dc6ef56
parentb1a8c0fe022e99cffb0fb4f321740464f35bc6b9 (diff)
parent32f2d9d089ced7d693aa412821f1d66134877cf0 (diff)
downloadrtmux-ed575182e3018d81a0b3b81bde4a64bad967c298.tar.gz
rtmux-ed575182e3018d81a0b3b81bde4a64bad967c298.tar.bz2
rtmux-ed575182e3018d81a0b3b81bde4a64bad967c298.zip
Merge branch 'obsd-master' into master
-rw-r--r--cmd-new-session.c13
-rw-r--r--cmd-rename-session.c5
-rw-r--r--session.c2
-rw-r--r--tmux.c15
4 files changed, 29 insertions, 6 deletions
diff --git a/cmd-new-session.c b/cmd-new-session.c
index c47d66cd..666aeaac 100644
--- a/cmd-new-session.c
+++ b/cmd-new-session.c
@@ -102,6 +102,11 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
if (tmp != NULL) {
name = format_single(item, tmp, c, NULL, NULL, NULL);
newname = session_check_name(name);
+ if (newname == NULL) {
+ cmdq_error(item, "invalid session: %s", name);
+ free(name);
+ return (CMD_RETURN_ERROR);
+ }
free(name);
}
if (args_has(args, 'A')) {
@@ -134,8 +139,14 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
prefix = xstrdup(sg->name);
else if (groupwith != NULL)
prefix = xstrdup(groupwith->name);
- else
+ else {
prefix = session_check_name(group);
+ if (prefix == NULL) {
+ cmdq_error(item, "invalid session group: %s",
+ group);
+ goto fail;
+ }
+ }
}
/* Set -d if no client. */
diff --git a/cmd-rename-session.c b/cmd-rename-session.c
index 51b8ffc8..49fafe33 100644
--- a/cmd-rename-session.c
+++ b/cmd-rename-session.c
@@ -53,6 +53,11 @@ cmd_rename_session_exec(struct cmd *self, struct cmdq_item *item)
tmp = format_single_from_target(item, args->argv[0]);
newname = session_check_name(tmp);
+ if (newname == NULL) {
+ cmdq_error(item, "invalid session: %s", tmp);
+ free(tmp);
+ return (CMD_RETURN_ERROR);
+ }
free(tmp);
if (strcmp(newname, s->name) == 0) {
free(newname);
diff --git a/session.c b/session.c
index 87c5b83c..76ad6ddf 100644
--- a/session.c
+++ b/session.c
@@ -235,6 +235,8 @@ session_check_name(const char *name)
{
char *copy, *cp, *new_name;
+ if (*name == '\0')
+ return (NULL);
copy = xstrdup(name);
for (cp = copy; *cp != '\0'; cp++) {
if (*cp == ':' || *cp == '.')
diff --git a/tmux.c b/tmux.c
index 29921781..1fdba727 100644
--- a/tmux.c
+++ b/tmux.c
@@ -207,16 +207,22 @@ make_label(const char *label, char **cause)
free(paths);
xasprintf(&base, "%s/tmux-%ld", path, (long)uid);
- if (mkdir(base, S_IRWXU) != 0 && errno != EEXIST)
+ if (mkdir(base, S_IRWXU) != 0 && errno != EEXIST) {
+ xasprintf(cause, "couldn't create directory %s (%s)", base,
+ strerror(errno));
goto fail;
- if (lstat(base, &sb) != 0)
+ }
+ if (lstat(base, &sb) != 0) {
+ xasprintf(cause, "couldn't read directory %s (%s)", base,
+ strerror(errno));
goto fail;
+ }
if (!S_ISDIR(sb.st_mode)) {
- errno = ENOTDIR;
+ xasprintf(cause, "%s is not a directory", base);
goto fail;
}
if (sb.st_uid != uid || (sb.st_mode & S_IRWXO) != 0) {
- errno = EACCES;
+ xasprintf(cause, "directory %s has unsafe permissions", base);
goto fail;
}
xasprintf(&path, "%s/%s", base, label);
@@ -224,7 +230,6 @@ make_label(const char *label, char **cause)
return (path);
fail:
- xasprintf(cause, "error creating %s (%s)", base, strerror(errno));
free(base);
return (NULL);
}