mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
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)caf73dcfad
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.7e0f462db5
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().439c036ed0
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)70cf45810c
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)185577e47e
This commit is contained in:
parent
c6ccdda26a
commit
cb6b5e5540
@ -1251,7 +1251,7 @@ static char_u * do_one_cmd(char_u **cmdlinep,
|
|||||||
char_u *errormsg = NULL; // error message
|
char_u *errormsg = NULL; // error message
|
||||||
char_u *after_modifier = NULL;
|
char_u *after_modifier = NULL;
|
||||||
exarg_T ea;
|
exarg_T ea;
|
||||||
int save_msg_scroll = msg_scroll;
|
const int save_msg_scroll = msg_scroll;
|
||||||
cmdmod_T save_cmdmod;
|
cmdmod_T save_cmdmod;
|
||||||
const int save_reg_executing = reg_executing;
|
const int save_reg_executing = reg_executing;
|
||||||
char_u *cmd;
|
char_u *cmd;
|
||||||
@ -2003,34 +2003,10 @@ doend:
|
|||||||
? cmdnames[(int)ea.cmdidx].cmd_name
|
? cmdnames[(int)ea.cmdidx].cmd_name
|
||||||
: (char_u *)NULL);
|
: (char_u *)NULL);
|
||||||
|
|
||||||
if (ea.verbose_save >= 0) {
|
undo_cmdmod(&ea, save_msg_scroll);
|
||||||
p_verbose = ea.verbose_save;
|
|
||||||
}
|
|
||||||
free_cmdmod();
|
|
||||||
|
|
||||||
cmdmod = save_cmdmod;
|
cmdmod = save_cmdmod;
|
||||||
reg_executing = save_reg_executing;
|
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) {
|
if (ea.did_sandbox) {
|
||||||
sandbox--;
|
sandbox--;
|
||||||
}
|
}
|
||||||
@ -2298,9 +2274,14 @@ int parse_command_modifiers(exarg_T *eap, char_u **errormsg, bool skip_only)
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Free contents of "cmdmod".
|
// Undo and free contents of "cmdmod".
|
||||||
static void free_cmdmod(void)
|
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) {
|
if (cmdmod.save_ei != NULL) {
|
||||||
/* Restore 'eventignore' to the value before ":noautocmd". */
|
/* Restore 'eventignore' to the value before ":noautocmd". */
|
||||||
set_string_option_direct((char_u *)"ei", -1, cmdmod.save_ei,
|
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);
|
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)) {
|
else if (p[0] == '`' && p[1] == '=' && (eap->argt & XFILE)) {
|
||||||
p += 2;
|
p += 2;
|
||||||
(void)skip_expr(&p);
|
(void)skip_expr(&p);
|
||||||
|
if (*p == NUL) { // stop at NUL after CTRL-V
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* Check for '"': start of comment or '|': next command */
|
/* Check for '"': start of comment or '|': next command */
|
||||||
/* :@" does not start a comment!
|
/* :@" does not start a comment!
|
||||||
|
@ -1587,4 +1587,11 @@ func Test_edit_browse()
|
|||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
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
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
Loading…
Reference in New Issue
Block a user