summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-06-06 15:14:08 +0200
committerBram Moolenaar <Bram@vim.org>2020-06-06 15:14:08 +0200
commit9b7cce28d568f0622d77c6c9878c2d4770c3b164 (patch)
treee2b44d4a5a64fbeadefebbe8412f88df5ac2639b
parent87fda407f8ecf947ba6ce72ac21f69ff04d909cd (diff)
downloadvim-git-9b7cce28d568f0622d77c6c9878c2d4770c3b164.tar.gz
patch 8.2.0911: crash when opening a buffer for the cmdline window failsv8.2.0911
Problem: Crash when opening a buffer for the cmdline window fails. (Chris Barber) Solution: Check do_ecmd() succeeds. Reset got_int if "q" was used at the more prompt. (closes #6211)
-rw-r--r--src/ex_getln.c16
-rw-r--r--src/testdir/dumps/Test_cmdwin_interrupted.dump18
-rw-r--r--src/testdir/test_cmdline.vim27
-rw-r--r--src/version.c2
4 files changed, 60 insertions, 3 deletions
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 48d40cfc7..c003748e9 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -682,7 +682,8 @@ may_add_char_to_search(int firstc, int *c, incsearch_state_T *is_state)
// NOTE: must call restore_last_search_pattern() before returning!
save_last_search_pattern();
- if (!do_incsearch_highlighting(firstc, &search_delim, is_state, &skiplen, &patlen))
+ if (!do_incsearch_highlighting(firstc, &search_delim, is_state,
+ &skiplen, &patlen))
{
restore_last_search_pattern();
return FAIL;
@@ -4205,10 +4206,19 @@ open_cmdwin(void)
ga_clear(&winsizes);
return K_IGNORE;
}
- cmdwin_type = get_cmdline_type();
+ // Don't let quitting the More prompt make this fail.
+ got_int = FALSE;
// Create the command-line buffer empty.
- (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, NULL);
+ if (do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, NULL) == FAIL)
+ {
+ // Some autocommand messed it up?
+ win_close(curwin, TRUE);
+ ga_clear(&winsizes);
+ return Ctrl_C;
+ }
+ cmdwin_type = get_cmdline_type();
+
apply_autocmds(EVENT_BUFFILEPRE, NULL, NULL, FALSE, curbuf);
(void)setfname(curbuf, (char_u *)"[Command Line]", NULL, TRUE);
apply_autocmds(EVENT_BUFFILEPOST, NULL, NULL, FALSE, curbuf);
diff --git a/src/testdir/dumps/Test_cmdwin_interrupted.dump b/src/testdir/dumps/Test_cmdwin_interrupted.dump
new file mode 100644
index 000000000..325bc5458
--- /dev/null
+++ b/src/testdir/dumps/Test_cmdwin_interrupted.dump
@@ -0,0 +1,18 @@
+> +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|d+0#0000000&|o|n|e| @52|0|,|0|-|1| @8|A|l@1|
diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim
index 66f6e90fe..b5e316cf1 100644
--- a/src/testdir/test_cmdline.vim
+++ b/src/testdir/test_cmdline.vim
@@ -1183,6 +1183,33 @@ func Test_cmdwin_jump_to_win()
call assert_equal(1, winnr('$'))
endfunc
+func Test_cmdwin_interrupted()
+ CheckScreendump
+
+ " aborting the :smile output caused the cmdline window to use the current
+ " buffer.
+ let lines =<< trim [SCRIPT]
+ au WinNew * smile
+ [SCRIPT]
+ call writefile(lines, 'XTest_cmdwin')
+
+ let buf = RunVimInTerminal('-S XTest_cmdwin', {'rows': 18})
+ call TermWait(buf, 1000)
+ " open cmdwin
+ call term_sendkeys(buf, "q:")
+ call TermWait(buf, 500)
+ " quit more prompt for :smile command
+ call term_sendkeys(buf, "q")
+ call TermWait(buf, 500)
+ " execute a simple command
+ call term_sendkeys(buf, "aecho 'done'\<CR>")
+ call VerifyScreenDump(buf, 'Test_cmdwin_interrupted', {})
+
+ " clean up
+ call StopVimInTerminal(buf)
+ call delete('XTest_cmdwin')
+endfunc
+
" Test for backtick expression in the command line
func Test_cmd_backtick()
%argd
diff --git a/src/version.c b/src/version.c
index f81596949..f724445ee 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 911,
+/**/
910,
/**/
909,