summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Leadbeater <dgl@dgl.cx>2023-10-26 22:00:34 +0200
committerChristian Brabandt <cb@256bit.org>2023-10-26 22:08:41 +0200
commit67ec6553839f070cd4cc8effa26a9db1750e17b6 (patch)
treebe1cecd44dd589c7b9805f2e4f545131b6337601
parent9198c1f2b1ddecde22af918541e0de2a32f0f45a (diff)
patch 9.0.2069: possible to escape bracketed paste mode with Ctrl-Cv9.0.2069
Problem: possible to escape bracketed paste mode with Ctrl-C Solution: Do not handle Ctrl-C specially when key_protocol is in use, makes bracketed paste mode more robust When a key protocol is in use Ctrl-C will be sent as an escape sequence, but a raw Ctrl-C can be sent when pasting data. Pass this through, so that a Ctrl-C can be pasted and won't result in exiting insert mode (where the rest of the pasted keys can cause all kind of nasty side-effects). Many terminals will strip control characters in paste data (and xterm will strip ^C since version 388), but this provides some defense in depth if users change settings like xterm's allowPasteControls. closes: #13398 Signed-off-by: David Leadbeater <dgl@dgl.cx> Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r--src/getchar.c2
-rw-r--r--src/proto/getchar.pro1
-rw-r--r--src/ui.c6
-rw-r--r--src/version.c2
4 files changed, 9 insertions, 2 deletions
diff --git a/src/getchar.c b/src/getchar.c
index 6867b59ed7..da05033709 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -2511,7 +2511,7 @@ check_simplify_modifier(int max_offset)
* modifyOtherKeys level 2 is enabled or the kitty keyboard protocol is
* enabled.
*/
- static int
+ int
key_protocol_enabled(void)
{
// If xterm has responded to XTQMODKEYS it overrules seenModifyOtherKeys.
diff --git a/src/proto/getchar.pro b/src/proto/getchar.pro
index 7e05870a97..b122a14d05 100644
--- a/src/proto/getchar.pro
+++ b/src/proto/getchar.pro
@@ -51,6 +51,7 @@ void f_getchar(typval_T *argvars, typval_T *rettv);
void f_getcharstr(typval_T *argvars, typval_T *rettv);
void f_getcharmod(typval_T *argvars, typval_T *rettv);
void parse_queued_messages(void);
+int key_protocol_enabled(void);
void vungetc(int c);
int fix_input_buffer(char_u *buf, int len);
int input_available(void);
diff --git a/src/ui.c b/src/ui.c
index 2e78f8adfb..ea9125280d 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -1032,7 +1032,11 @@ fill_input_buf(int exit_on_error UNUSED)
// If a CTRL-C was typed, remove it from the buffer and set
// got_int. Also recognize CTRL-C with modifyOtherKeys set, lower
// and upper case, in two forms.
- if (ctrl_c_interrupts && (inbuf[inbufcount] == 3
+ // If terminal key protocols are in use, we expect to receive
+ // Ctrl_C as an escape sequence, ignore a raw Ctrl_C as this could
+ // be paste data.
+ if (ctrl_c_interrupts
+ && ((inbuf[inbufcount] == Ctrl_C && !key_protocol_enabled())
|| (len >= 10 && STRNCMP(inbuf + inbufcount,
"\033[27;5;99~", 10) == 0)
|| (len >= 10 && STRNCMP(inbuf + inbufcount,
diff --git a/src/version.c b/src/version.c
index 0284594f76..890e92c7cb 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2069,
+/**/
2068,
/**/
2067,