aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2020-10-27 19:22:28 -0400
committerJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2020-10-29 18:36:05 -0400
commitcb6b5e5540e737fdf391905f87eb3ed3c98b0fbd (patch)
treefd71ea86163636121d1b14b647517ab0ee4894c6 /src
parentc6ccdda26ae0b8a9bf4d0779d398cb7c9864aedf (diff)
downloadrneovim-cb6b5e5540e737fdf391905f87eb3ed3c98b0fbd.tar.gz
rneovim-cb6b5e5540e737fdf391905f87eb3ed3c98b0fbd.tar.bz2
rneovim-cb6b5e5540e737fdf391905f87eb3ed3c98b0fbd.zip
vim-patch:8.2.1910: reading past the end of the command line
Problem: Reading past the end of the command line. Solution: Check for NUL. (closes vim/vim#7204) https://github.com/vim/vim/commit/caf73dcfade0a435ea3f989285b43f07c40c9948 Cherry-pick undo_cmdmod() from patch 8.2.1137. N/A patches for version.c: vim-patch:8.1.2050: popup window test fails in some configurations Problem: Popup window test fails in some configurations. (James McCoy) Solution: Clear the command line. https://github.com/vim/vim/commit/7e0f462db594e3e2eee3a55531250a6afc9c0b92 vim-patch:8.2.0913: code for resetting v:register is duplicated Problem: Code for resetting v:register is duplicated. Solution: Add reset_reg_var(). https://github.com/vim/vim/commit/439c036ed062de1c87cc7e3fe050a9569fb12089 reset_reg_var() is not ported. Use set_reg_var(get_default_register_name()) instead. vim-patch:8.2.1913: GTK GUI: rounding for the cell height is too strict Problem: GTK GUI: rounding for the cell height is too strict. Solution: Round up above 15/16 of a pixel. (closes vim/vim#7203) https://github.com/vim/vim/commit/70cf45810cb9be5bd17074f7fb4ee238f2c4d57b vim-patch:8.2.1922: Win32: scrolling problems when part of window is off-screen Problem: Win32: scrolling doesn't work properly when part of window is off-screen. Solution: Fall back to GDI scrolling if part of the window is off-screen. Handle multi-monitor setup better. (Ken Takata, closes vim/vim#7219) https://github.com/vim/vim/commit/185577e47e5004a5d08a5405a02ab6a261078e42
Diffstat (limited to 'src')
-rw-r--r--src/nvim/ex_docmd.c63
-rw-r--r--src/nvim/testdir/test_edit.vim7
2 files changed, 40 insertions, 30 deletions
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index 211791c19d..ad7db2ae98 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -1251,7 +1251,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
char_u *errormsg = NULL; // error message
char_u *after_modifier = NULL;
exarg_T ea;
- int save_msg_scroll = msg_scroll;
+ const int save_msg_scroll = msg_scroll;
cmdmod_T save_cmdmod;
const int save_reg_executing = reg_executing;
char_u *cmd;
@@ -2003,34 +2003,10 @@ doend:
? cmdnames[(int)ea.cmdidx].cmd_name
: (char_u *)NULL);
- if (ea.verbose_save >= 0) {
- p_verbose = ea.verbose_save;
- }
- free_cmdmod();
-
+ undo_cmdmod(&ea, save_msg_scroll);
cmdmod = save_cmdmod;
reg_executing = save_reg_executing;
- if (ea.save_msg_silent != -1) {
- // messages could be enabled for a serious error, need to check if the
- // counters don't become negative
- if (!did_emsg || msg_silent > ea.save_msg_silent) {
- msg_silent = ea.save_msg_silent;
- }
- emsg_silent -= ea.did_esilent;
- if (emsg_silent < 0) {
- emsg_silent = 0;
- }
- // Restore msg_scroll, it's set by file I/O commands, even when no
- // message is actually displayed.
- msg_scroll = save_msg_scroll;
-
- /* "silent reg" or "silent echo x" inside "redir" leaves msg_col
- * somewhere in the line. Put it back in the first column. */
- if (redirecting())
- msg_col = 0;
- }
-
if (ea.did_sandbox) {
sandbox--;
}
@@ -2298,9 +2274,14 @@ int parse_command_modifiers(exarg_T *eap, char_u **errormsg, bool skip_only)
return OK;
}
-// Free contents of "cmdmod".
-static void free_cmdmod(void)
+// Undo and free contents of "cmdmod".
+static void undo_cmdmod(const exarg_T *eap, int save_msg_scroll)
+ FUNC_ATTR_NONNULL_ALL
{
+ if (eap->verbose_save >= 0) {
+ p_verbose = eap->verbose_save;
+ }
+
if (cmdmod.save_ei != NULL) {
/* Restore 'eventignore' to the value before ":noautocmd". */
set_string_option_direct((char_u *)"ei", -1, cmdmod.save_ei,
@@ -2308,8 +2289,27 @@ static void free_cmdmod(void)
free_string_option(cmdmod.save_ei);
}
- if (cmdmod.filter_regmatch.regprog != NULL) {
- vim_regfree(cmdmod.filter_regmatch.regprog);
+ vim_regfree(cmdmod.filter_regmatch.regprog);
+
+ if (eap->save_msg_silent != -1) {
+ // messages could be enabled for a serious error, need to check if the
+ // counters don't become negative
+ if (!did_emsg || msg_silent > eap->save_msg_silent) {
+ msg_silent = eap->save_msg_silent;
+ }
+ emsg_silent -= eap->did_esilent;
+ if (emsg_silent < 0) {
+ emsg_silent = 0;
+ }
+ // Restore msg_scroll, it's set by file I/O commands, even when no
+ // message is actually displayed.
+ msg_scroll = save_msg_scroll;
+
+ // "silent reg" or "silent echo x" inside "redir" leaves msg_col
+ // somewhere in the line. Put it back in the first column.
+ if (redirecting()) {
+ msg_col = 0;
+ }
}
}
@@ -4446,6 +4446,9 @@ void separate_nextcmd(exarg_T *eap)
else if (p[0] == '`' && p[1] == '=' && (eap->argt & XFILE)) {
p += 2;
(void)skip_expr(&p);
+ if (*p == NUL) { // stop at NUL after CTRL-V
+ break;
+ }
}
/* Check for '"': start of comment or '|': next command */
/* :@" does not start a comment!
diff --git a/src/nvim/testdir/test_edit.vim b/src/nvim/testdir/test_edit.vim
index 15c718b243..abad6983dc 100644
--- a/src/nvim/testdir/test_edit.vim
+++ b/src/nvim/testdir/test_edit.vim
@@ -1587,4 +1587,11 @@ func Test_edit_browse()
bwipe!
endfunc
+func Test_read_invalid()
+ " set encoding=latin1
+ " This was not properly checking for going past the end.
+ call assert_fails('r`=', 'E484')
+ set encoding=utf-8
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab