]> granicus.if.org Git - vim/commitdiff
patch 9.0.0051: using CTRL-C wih :append may hang Vim v9.0.0051
authorzeertzjq <zeertzjq@outlook.com>
Thu, 14 Jul 2022 16:06:12 +0000 (17:06 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 14 Jul 2022 16:06:12 +0000 (17:06 +0100)
Problem:    Using CTRL-C wih :append may hang Vim.
Solution:   Reset got_int. (closes #10729, closes #10728)

src/ex_getln.c
src/testdir/test_ex_mode.vim
src/version.c

index 8dc03dc336c80d62167b443516f41cdf68f6134c..dd538941efce3cdc3b09dae9f81de61e6536d40a 100644 (file)
@@ -1786,6 +1786,8 @@ getcmdline_int(
                                // that occurs while typing a command should
                                // cause the command not to be executed.
 
+       got_int = FALSE;        // avoid infinite Ctrl-C loop in Ex mode
+
        // Trigger SafeState if nothing is pending.
        may_trigger_safestate(xpc.xp_numfiles <= 0);
 
index fafdda8de3a09aa8e8ff17c75a3828f451bab83b..50bc1db997049eb113f4ee900468b74abb30b177 100644 (file)
@@ -145,6 +145,29 @@ func Test_Ex_global()
   bwipe!
 endfunc
 
+" Test for pressing Ctrl-C in :append inside a loop in Ex mode
+" This used to hang Vim
+func Test_Ex_append_in_loop()
+  CheckRunVimInTerminal
+  let buf = RunVimInTerminal('', {'rows': 6})
+
+  call term_sendkeys(buf, "gQ")
+  call term_sendkeys(buf, "for i in range(1)\<CR>")
+  call term_sendkeys(buf, "append\<CR>")
+  call WaitForAssert({-> assert_match(':  append', term_getline(buf, 5))}, 1000)
+  call term_sendkeys(buf, "\<C-C>")
+  call term_wait(buf)
+  call term_sendkeys(buf, "foo\<CR>")
+  call WaitForAssert({-> assert_match('foo', term_getline(buf, 5))}, 1000)
+  call term_sendkeys(buf, ".\<CR>")
+  call WaitForAssert({-> assert_match('.', term_getline(buf, 5))}, 1000)
+  call term_sendkeys(buf, "endfor\<CR>")
+  call term_sendkeys(buf, "vi\<CR>")
+  call WaitForAssert({-> assert_match('foo', term_getline(buf, 1))}, 1000)
+
+  call StopVimInTerminal(buf)
+endfunc
+
 " In Ex-mode, a backslash escapes a newline
 func Test_Ex_escape_enter()
   call feedkeys("gQlet l = \"a\\\<kEnter>b\"\<cr>vi\<cr>", 'xt')
index 8df43414052e14ab9e7938e453010d7f72e83026..a6a80b6719be18a7b477dab9bbfd02bcd6ea53dd 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    51,
 /**/
     50,
 /**/