summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2020-01-13 07:51:56 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2020-01-13 07:51:56 +0000
commit779a4828d19f825060ec59235724fcb5b72752bd (patch)
treec868e655a94f9042f78fc104b0dd6768015642f4 /usr.bin
parenta64a67c8ce306fe62a7347bb653caad3129bebb2 (diff)
Treat plausible but invalid keys (like C-BSpace) as literal like any
other unrecognised string passed to send-keys. Reported by Anthony Sottile in GitHub issue 2049.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/tmux/cmd-send-keys.c16
-rw-r--r--usr.bin/tmux/input-keys.c19
-rw-r--r--usr.bin/tmux/tmux.h6
-rw-r--r--usr.bin/tmux/window.c16
4 files changed, 34 insertions, 23 deletions
diff --git a/usr.bin/tmux/cmd-send-keys.c b/usr.bin/tmux/cmd-send-keys.c
index e30f2f09a19..22826b25b1a 100644
--- a/usr.bin/tmux/cmd-send-keys.c
+++ b/usr.bin/tmux/cmd-send-keys.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-send-keys.c,v 1.51 2019/11/07 07:11:25 nicm Exp $ */
+/* $OpenBSD: cmd-send-keys.c,v 1.52 2020/01/13 07:51:54 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -60,6 +60,9 @@ static struct cmdq_item *
cmd_send_keys_inject_key(struct client *c, struct cmd_find_state *fs,
struct cmdq_item *item, key_code key)
{
+ struct session *s = fs->s;
+ struct winlink *wl = fs->wl;
+ struct window_pane *wp = fs->wp;
struct window_mode_entry *wme;
struct key_table *table;
struct key_binding *bd;
@@ -68,7 +71,8 @@ cmd_send_keys_inject_key(struct client *c, struct cmd_find_state *fs,
if (wme == NULL || wme->mode->key_table == NULL) {
if (options_get_number(fs->wp->window->options, "xterm-keys"))
key |= KEYC_XTERM;
- window_pane_key(fs->wp, item->client, fs->s, fs->wl, key, NULL);
+ if (window_pane_key(wp, item->client, s, wl, key, NULL) != 0)
+ return (NULL);
return (item);
}
table = key_bindings_get_table(wme->mode->key_table(wme), 1);
@@ -87,6 +91,7 @@ cmd_send_keys_inject_string(struct client *c, struct cmd_find_state *fs,
struct cmdq_item *item, struct args *args, int i)
{
const char *s = args->argv[i];
+ struct cmdq_item *new_item;
struct utf8_data *ud, *uc;
wchar_t wc;
key_code key;
@@ -104,8 +109,11 @@ cmd_send_keys_inject_string(struct client *c, struct cmd_find_state *fs,
literal = args_has(args, 'l');
if (!literal) {
key = key_string_lookup_string(s);
- if (key != KEYC_NONE && key != KEYC_UNKNOWN)
- return (cmd_send_keys_inject_key(c, fs, item, key));
+ if (key != KEYC_NONE && key != KEYC_UNKNOWN) {
+ new_item = cmd_send_keys_inject_key(c, fs, item, key);
+ if (new_item != NULL)
+ return (new_item);
+ }
literal = 1;
}
if (literal) {
diff --git a/usr.bin/tmux/input-keys.c b/usr.bin/tmux/input-keys.c
index 8934a58756f..0ba6a9376fd 100644
--- a/usr.bin/tmux/input-keys.c
+++ b/usr.bin/tmux/input-keys.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: input-keys.c,v 1.66 2019/11/18 09:42:09 nicm Exp $ */
+/* $OpenBSD: input-keys.c,v 1.67 2020/01/13 07:51:54 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -150,7 +150,7 @@ input_split2(u_int c, u_char *dst)
}
/* Translate a key code into an output key sequence. */
-void
+int
input_key(struct window_pane *wp, key_code key, struct mouse_event *m)
{
const struct input_key_ent *ike;
@@ -167,14 +167,14 @@ input_key(struct window_pane *wp, key_code key, struct mouse_event *m)
if (KEYC_IS_MOUSE(key)) {
if (m != NULL && m->wp != -1 && (u_int)m->wp == wp->id)
input_key_mouse(wp, m);
- return;
+ return (0);
}
/* Literal keys go as themselves (can't be more than eight bits). */
if (key & KEYC_LITERAL) {
ud.data[0] = (u_char)key;
bufferevent_write(wp->event, &ud.data[0], 1);
- return;
+ return (0);
}
/* Is this backspace? */
@@ -195,15 +195,15 @@ input_key(struct window_pane *wp, key_code key, struct mouse_event *m)
bufferevent_write(wp->event, "\033", 1);
ud.data[0] = justkey;
bufferevent_write(wp->event, &ud.data[0], 1);
- return;
+ return (0);
}
if (justkey > 0x7f && justkey < KEYC_BASE) {
if (utf8_split(justkey, &ud) != UTF8_DONE)
- return;
+ return (-1);
if (key & KEYC_ESCAPE)
bufferevent_write(wp->event, "\033", 1);
bufferevent_write(wp->event, ud.data, ud.size);
- return;
+ return (0);
}
/*
@@ -214,7 +214,7 @@ input_key(struct window_pane *wp, key_code key, struct mouse_event *m)
if ((out = xterm_keys_lookup(key)) != NULL) {
bufferevent_write(wp->event, out, strlen(out));
free(out);
- return;
+ return (0);
}
}
key &= ~KEYC_XTERM;
@@ -237,7 +237,7 @@ input_key(struct window_pane *wp, key_code key, struct mouse_event *m)
}
if (i == nitems(input_keys)) {
log_debug("key 0x%llx missing", key);
- return;
+ return (-1);
}
dlen = strlen(ike->data);
log_debug("found key 0x%llx: \"%s\"", key, ike->data);
@@ -246,6 +246,7 @@ input_key(struct window_pane *wp, key_code key, struct mouse_event *m)
if (key & KEYC_ESCAPE)
bufferevent_write(wp->event, "\033", 1);
bufferevent_write(wp->event, ike->data, dlen);
+ return (0);
}
/* Translate mouse and output. */
diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index b735f5df690..2209d616f91 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.945 2020/01/12 21:07:07 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.946 2020/01/13 07:51:55 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -2275,7 +2275,7 @@ void input_parse(struct window_pane *);
void input_parse_buffer(struct window_pane *, u_char *, size_t);
/* input-key.c */
-void input_key(struct window_pane *, key_code, struct mouse_event *);
+int input_key(struct window_pane *, key_code, struct mouse_event *);
/* xterm-keys.c */
char *xterm_keys_lookup(key_code);
@@ -2498,7 +2498,7 @@ int window_pane_set_mode(struct window_pane *,
struct args *);
void window_pane_reset_mode(struct window_pane *);
void window_pane_reset_mode_all(struct window_pane *);
-void window_pane_key(struct window_pane *, struct client *,
+int window_pane_key(struct window_pane *, struct client *,
struct session *, struct winlink *, key_code,
struct mouse_event *);
int window_pane_visible(struct window_pane *);
diff --git a/usr.bin/tmux/window.c b/usr.bin/tmux/window.c
index 2d8755af148..03464301eec 100644
--- a/usr.bin/tmux/window.c
+++ b/usr.bin/tmux/window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: window.c,v 1.246 2019/12/12 11:39:56 nicm Exp $ */
+/* $OpenBSD: window.c,v 1.247 2020/01/13 07:51:55 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1229,7 +1229,7 @@ window_pane_reset_mode_all(struct window_pane *wp)
window_pane_reset_mode(wp);
}
-void
+int
window_pane_key(struct window_pane *wp, struct client *c, struct session *s,
struct winlink *wl, key_code key, struct mouse_event *m)
{
@@ -1237,23 +1237,24 @@ window_pane_key(struct window_pane *wp, struct client *c, struct session *s,
struct window_pane *wp2;
if (KEYC_IS_MOUSE(key) && m == NULL)
- return;
+ return (-1);
wme = TAILQ_FIRST(&wp->modes);
if (wme != NULL) {
wp->modelast = time(NULL);
if (wme->mode->key != NULL)
wme->mode->key(wme, c, s, wl, (key & ~KEYC_XTERM), m);
- return;
+ return (0);
}
if (wp->fd == -1 || wp->flags & PANE_INPUTOFF)
- return;
+ return (0);
- input_key(wp, key, m);
+ if (input_key(wp, key, m) != 0)
+ return (-1);
if (KEYC_IS_MOUSE(key))
- return;
+ return (0);
if (options_get_number(wp->window->options, "synchronize-panes")) {
TAILQ_FOREACH(wp2, &wp->window->panes, entry) {
if (wp2 != wp &&
@@ -1264,6 +1265,7 @@ window_pane_key(struct window_pane *wp, struct client *c, struct session *s,
input_key(wp2, key, NULL);
}
}
+ return (0);
}
int