summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/tmux/cmd-new-session.c37
-rw-r--r--usr.bin/tmux/cmd-rename-session.c14
-rw-r--r--usr.bin/tmux/session.c21
-rw-r--r--usr.bin/tmux/tmux.h4
4 files changed, 37 insertions, 39 deletions
diff --git a/usr.bin/tmux/cmd-new-session.c b/usr.bin/tmux/cmd-new-session.c
index 93fe640d1e0..dbdc92ca4e0 100644
--- a/usr.bin/tmux/cmd-new-session.c
+++ b/usr.bin/tmux/cmd-new-session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-new-session.c,v 1.130 2020/04/13 20:51:57 nicm Exp $ */
+/* $OpenBSD: cmd-new-session.c,v 1.131 2020/05/16 14:49:50 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -70,13 +70,14 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
struct cmd_find_state *current = cmdq_get_current(item);
struct cmd_find_state *target = cmdq_get_target(item);
struct client *c = cmdq_get_client(item);
- struct session *s, *as, *groupwith;
+ struct session *s, *as, *groupwith = NULL;
struct environ *env;
struct options *oo;
struct termios tio, *tiop;
- struct session_group *sg;
- const char *errstr, *template, *group, *prefix, *tmp;
+ struct session_group *sg = NULL;
+ const char *errstr, *template, *group, *tmp;
char *cause, *cwd = NULL, *cp, *newname = NULL;
+ char *name, *prefix = NULL;
int detached, already_attached, is_control = 0;
u_int sx, sy, dsx, dsy;
struct spawn_context sc;
@@ -98,11 +99,9 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
tmp = args_get(args, 's');
if (tmp != NULL) {
- newname = format_single(item, tmp, c, NULL, NULL, NULL);
- if (!session_check_name(newname)) {
- cmdq_error(item, "bad session name: %s", newname);
- goto fail;
- }
+ name = format_single(item, tmp, c, NULL, NULL, NULL);
+ newname = session_check_name(name);
+ free(name);
}
if (args_has(args, 'A')) {
if (newname != NULL)
@@ -126,24 +125,16 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
group = args_get(args, 't');
if (group != NULL) {
groupwith = target->s;
- if (groupwith == NULL) {
- if (!session_check_name(group)) {
- cmdq_error(item, "bad group name: %s", group);
- goto fail;
- }
+ if (groupwith == NULL)
sg = session_group_find(group);
- } else
+ else
sg = session_group_contains(groupwith);
if (sg != NULL)
- prefix = sg->name;
+ prefix = xstrdup(sg->name);
else if (groupwith != NULL)
- prefix = groupwith->name;
+ prefix = xstrdup(groupwith->name);
else
- prefix = group;
- } else {
- groupwith = NULL;
- sg = NULL;
- prefix = NULL;
+ prefix = session_check_name(group);
}
/* Set -d if no client. */
@@ -353,10 +344,12 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
free(cwd);
free(newname);
+ free(prefix);
return (CMD_RETURN_NORMAL);
fail:
free(cwd);
free(newname);
+ free(prefix);
return (CMD_RETURN_ERROR);
}
diff --git a/usr.bin/tmux/cmd-rename-session.c b/usr.bin/tmux/cmd-rename-session.c
index bd7fe72e0d3..b58ee54095e 100644
--- a/usr.bin/tmux/cmd-rename-session.c
+++ b/usr.bin/tmux/cmd-rename-session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-rename-session.c,v 1.31 2020/04/13 20:51:57 nicm Exp $ */
+/* $OpenBSD: cmd-rename-session.c,v 1.32 2020/05/16 14:49:50 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -49,19 +49,15 @@ cmd_rename_session_exec(struct cmd *self, struct cmdq_item *item)
struct args *args = cmd_get_args(self);
struct cmd_find_state *target = cmdq_get_target(item);
struct session *s = target->s;
- char *newname;
+ char *newname, *tmp;
- newname = format_single_from_target(item, args->argv[0]);
+ tmp = format_single_from_target(item, args->argv[0]);
+ newname = session_check_name(tmp);
+ free(tmp);
if (strcmp(newname, s->name) == 0) {
free(newname);
return (CMD_RETURN_NORMAL);
}
-
- if (!session_check_name(newname)) {
- cmdq_error(item, "bad session name: %s", newname);
- free(newname);
- return (CMD_RETURN_ERROR);
- }
if (session_find(newname) != NULL) {
cmdq_error(item, "duplicate session: %s", newname);
free(newname);
diff --git a/usr.bin/tmux/session.c b/usr.bin/tmux/session.c
index a379f217fe6..3e1ec047d24 100644
--- a/usr.bin/tmux/session.c
+++ b/usr.bin/tmux/session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: session.c,v 1.86 2019/12/26 11:04:58 nicm Exp $ */
+/* $OpenBSD: session.c,v 1.87 2020/05/16 14:49:50 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -23,6 +23,7 @@
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
+#include <vis.h>
#include <time.h>
#include "tmux.h"
@@ -123,7 +124,6 @@ session_create(const char *prefix, const char *name, const char *cwd,
s->cwd = xstrdup(cwd);
- s->curw = NULL;
TAILQ_INIT(&s->lastw);
RB_INIT(&s->windows);
@@ -142,7 +142,6 @@ session_create(const char *prefix, const char *name, const char *cwd,
s->name = xstrdup(name);
s->id = next_session_id++;
} else {
- s->name = NULL;
do {
s->id = next_session_id++;
free(s->name);
@@ -232,11 +231,20 @@ session_destroy(struct session *s, int notify, const char *from)
session_remove_ref(s, __func__);
}
-/* Check a session name is valid: not empty and no colons or periods. */
-int
+/* Sanitize session name. */
+char *
session_check_name(const char *name)
{
- return (*name != '\0' && name[strcspn(name, ":.")] == '\0');
+ char *copy, *cp, *new_name;
+
+ copy = xstrdup(name);
+ for (cp = copy; *cp != '\0'; cp++) {
+ if (*cp == ':' || *cp == '.')
+ *cp = '_';
+ }
+ utf8_stravis(&new_name, copy, VIS_OCTAL|VIS_CSTYLE|VIS_TAB|VIS_NL);
+ free(copy);
+ return (new_name);
}
/* Lock session if it has timed out. */
@@ -556,6 +564,7 @@ session_group_remove(struct session *s)
TAILQ_REMOVE(&sg->sessions, s, gentry);
if (TAILQ_EMPTY(&sg->sessions)) {
RB_REMOVE(session_groups, &session_groups, sg);
+ free((void *)sg->name);
free(sg);
}
}
diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index e5024ba8b56..a78409b0058 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.1022 2020/05/16 14:46:14 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.1023 2020/05/16 14:49:50 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -2720,7 +2720,7 @@ struct session *session_create(const char *, const char *, const char *,
void session_destroy(struct session *, int, const char *);
void session_add_ref(struct session *, const char *);
void session_remove_ref(struct session *, const char *);
-int session_check_name(const char *);
+char *session_check_name(const char *);
void session_update_activity(struct session *, struct timeval *);
struct session *session_next_session(struct session *);
struct session *session_previous_session(struct session *);