]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.2069: possible to escape bracketed paste mode with Ctrl-C v9.0.2069
authorDavid Leadbeater <dgl@dgl.cx>
Thu, 26 Oct 2023 20:00:34 +0000 (22:00 +0200)
committerChristian Brabandt <cb@256bit.org>
Thu, 26 Oct 2023 20:08:41 +0000 (22:08 +0200)
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>
src/getchar.c
src/proto/getchar.pro
src/ui.c
src/version.c

index 6867b59ed71d8a775a3a7b3b3a128edd6bee13fa..da0503370965f2ef843c788ac7626eedbd1152ee 100644 (file)
@@ -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.
index 7e05870a974f12f18553f9495ea9db2a75a6f10b..b122a14d05533653fd544b4b14059a957c09d1cb 100644 (file)
@@ -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);
index 2e78f8adfbfe0331864b9c6f51302ad15eea6ce9..ea9125280d2dec710021f2d9d5fe572cf411e679 100644 (file)
--- 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,
index 0284594f7653ce9fd4a4cfa30616ae91ce23d3c2..890e92c7cb1cd1f77451043557dea437b7852431 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2069,
 /**/
     2068,
 /**/