Skip to content

Commit ef3b46a

Browse files
committed
Do not silently change invalid names given to commands.
1 parent f9a683c commit ef3b46a

9 files changed

Lines changed: 79 additions & 11 deletions

cmd-break-pane.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,20 @@ cmd_break_pane_exec(struct cmd *self, struct cmdq_item *item)
5858
struct session *dst_s = target->s;
5959
struct window_pane *wp = source->wp;
6060
struct window *w = wl->window;
61-
char *name, *cause, *cp;
61+
char *name, *cause, *cp, *newname;
6262
int idx = target->idx, before;
6363
const char *template;
6464

65+
if (args_has(args, 'n')) {
66+
newname = check_name(args_get(args, 'n'), "#");
67+
if (newname == NULL) {
68+
cmdq_error(item, "invalid window name: %s",
69+
args_get(args, 'n'));
70+
return (CMD_RETURN_ERROR);
71+
}
72+
free(newname);
73+
}
74+
6575
before = args_has(args, 'b');
6676
if (args_has(args, 'a') || before) {
6777
if (target->wl != NULL)

cmd-new-session.c

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,23 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
9999
return (CMD_RETURN_ERROR);
100100
}
101101

102+
tmp = args_get(args, 'n');
103+
if (tmp != NULL) {
104+
name = format_single(item, tmp, c, NULL, NULL, NULL);
105+
cp = check_name(name, "#");
106+
if (cp == NULL) {
107+
cmdq_error(item, "invalid window name: %s", name);
108+
free(name);
109+
return (CMD_RETURN_ERROR);
110+
}
111+
free(cp);
112+
free(name);
113+
}
114+
102115
tmp = args_get(args, 's');
103116
if (tmp != NULL) {
104117
name = format_single(item, tmp, c, NULL, NULL, NULL);
105-
newname = clean_name(name, "#:.");
118+
newname = check_name(name, "#:.");
106119
if (newname == NULL) {
107120
cmdq_error(item, "invalid session: %s", name);
108121
free(name);
@@ -142,7 +155,7 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
142155
else if (groupwith != NULL)
143156
prefix = xstrdup(groupwith->name);
144157
else {
145-
prefix = clean_name(group, "#:.");
158+
prefix = check_name(group, "#:.");
146159
if (prefix == NULL) {
147160
cmdq_error(item, "invalid session group: %s",
148161
group);

cmd-new-window.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,17 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item)
7171
* name already exists, select it.
7272
*/
7373
name = args_get(args, 'n');
74+
if (name != NULL) {
75+
expanded = format_single(item, name, c, s, NULL, NULL);
76+
cp = check_name(expanded, "#");
77+
if (cp == NULL) {
78+
cmdq_error(item, "invalid window name: %s", expanded);
79+
free(expanded);
80+
return (CMD_RETURN_ERROR);
81+
}
82+
free(cp);
83+
free(expanded);
84+
}
7485
if (args_has(args, 'S') && name != NULL && target->idx == -1) {
7586
expanded = format_single(item, name, c, s, NULL, NULL);
7687
RB_FOREACH(wl, winlinks, &s->windows) {

cmd-rename-session.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ cmd_rename_session_exec(struct cmd *self, struct cmdq_item *item)
5252
char *newname, *tmp;
5353

5454
tmp = format_single_from_target(item, args_string(args, 0));
55-
newname = clean_name(tmp, "#:.");
55+
newname = check_name(tmp, "#:.");
5656
if (newname == NULL) {
5757
cmdq_error(item, "invalid session: %s", tmp);
5858
free(tmp);

cmd-rename-window.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,17 @@ cmd_rename_window_exec(struct cmd *self, struct cmdq_item *item)
4848
struct args *args = cmd_get_args(self);
4949
struct cmd_find_state *target = cmdq_get_target(item);
5050
struct winlink *wl = target->wl;
51-
char *newname;
51+
char *newname, *tmp;
52+
53+
tmp = format_single_from_target(item, args_string(args, 0));
54+
newname = check_name(tmp, "#");
55+
if (newname == NULL) {
56+
cmdq_error(item, "invalid window name: %s", tmp);
57+
free(tmp);
58+
return (CMD_RETURN_ERROR);
59+
}
60+
free(tmp);
5261

53-
newname = format_single_from_target(item, args_string(args, 0));
5462
window_set_name(wl->window, newname);
5563
options_set_number(wl->window->options, "automatic-rename", 0);
5664

cmd-select-pane.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
9393
struct session *s = target->s;
9494
struct window_pane *wp = target->wp, *activewp, *lastwp, *markedwp;
9595
struct options *oo = wp->options;
96-
char *title;
96+
char *title, *newtitle;
9797
const char *style;
9898
struct options_entry *o;
9999

@@ -217,12 +217,19 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
217217

218218
if (args_has(args, 'T')) {
219219
title = format_single_from_target(item, args_get(args, 'T'));
220-
if (screen_set_title(&wp->base, title)) {
220+
newtitle = check_name(title, "#");
221+
if (newtitle == NULL) {
222+
cmdq_error(item, "invalid pane title: %s", title);
223+
free(title);
224+
return (CMD_RETURN_ERROR);
225+
}
226+
free(title);
227+
if (screen_set_title(&wp->base, newtitle)) {
221228
notify_pane("pane-title-changed", wp);
222229
server_redraw_window_borders(wp->window);
223230
server_status_window(wp->window);
224231
}
225-
free(title);
232+
free(newtitle);
226233
return (CMD_RETURN_NORMAL);
227234
}
228235

paste.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ paste_rename(const char *oldname, const char *newname, char **cause)
220220
return (-1);
221221
}
222222

223-
name = clean_name(newname, "");
223+
name = check_name(newname, "");
224224
if (name == NULL) {
225225
if (cause != NULL)
226226
xasprintf(cause, "invalid buffer name: %s", newname);
@@ -288,7 +288,7 @@ paste_set(char *data, size_t size, const char *name, char **cause)
288288
return (-1);
289289
}
290290

291-
newname = clean_name(name, "");
291+
newname = check_name(name, "");
292292
if (newname == NULL) {
293293
if (cause != NULL)
294294
xasprintf(cause, "invalid buffer name: %s", name);

tmux.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,24 @@ clean_name(const char *name, const char* forbid)
298298
return (new_name);
299299
}
300300

301+
/*
302+
* Like clean_name but for names given by a command: return the name only if it
303+
* is already clean, otherwise NULL so the command can reject it rather than
304+
* silently changing it.
305+
*/
306+
char *
307+
check_name(const char *name, const char *forbid)
308+
{
309+
char *new_name;
310+
311+
new_name = clean_name(name, forbid);
312+
if (new_name != NULL && strcmp(new_name, name) != 0) {
313+
free(new_name);
314+
return (NULL);
315+
}
316+
return (new_name);
317+
}
318+
301319
const char *
302320
sig2name(int signo)
303321
{

tmux.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2404,6 +2404,7 @@ void setblocking(int, int);
24042404
char *shell_argv0(const char *, int);
24052405
uint64_t get_timer(void);
24062406
char *clean_name(const char *, const char *);
2407+
char *check_name(const char *, const char *);
24072408
const char *sig2name(int);
24082409
const char *find_cwd(void);
24092410
const char *find_home(void);

0 commit comments

Comments
 (0)