vim-patch:8.2.4969: changing text in Visual mode may cause invalid memory access

Problem:    Changing text in Visual mode may cause invalid memory access.
Solution:   Check the Visual position after making a change.
7ce5b2b590
This commit is contained in:
zeertzjq 2022-05-17 08:10:34 +08:00
parent 26c906f54d
commit 527e861cbb
4 changed files with 34 additions and 7 deletions

View File

@ -209,6 +209,10 @@ static void changed_common(linenr_T lnum, colnr_T col, linenr_T lnume, long xtra
curwin->w_changelistidx = curbuf->b_changelistlen; curwin->w_changelistidx = curbuf->b_changelistlen;
} }
if (VIsual_active) {
check_visual_pos();
}
FOR_ALL_TAB_WINDOWS(tp, wp) { FOR_ALL_TAB_WINDOWS(tp, wp) {
if (wp->w_buffer == curbuf) { if (wp->w_buffer == curbuf) {
// Mark this window to be redrawn later. // Mark this window to be redrawn later.

View File

@ -399,6 +399,24 @@ void check_cursor(void)
check_cursor_col(); check_cursor_col();
} }
/// Check if VIsual position is valid, correct it if not.
/// Can be called when in Visual mode and a change has been made.
void check_visual_pos(void)
{
if (VIsual.lnum > curbuf->b_ml.ml_line_count) {
VIsual.lnum = curbuf->b_ml.ml_line_count;
VIsual.col = 0;
VIsual.coladd = 0;
} else {
int len = (int)STRLEN(ml_get(VIsual.lnum));
if (VIsual.col > len) {
VIsual.col = len;
VIsual.coladd = 0;
}
}
}
/// Make sure curwin->w_cursor is not on the NUL at the end of the line. /// Make sure curwin->w_cursor is not on the NUL at the end of the line.
/// Allow it when in Visual mode and 'selection' is not "old". /// Allow it when in Visual mode and 'selection' is not "old".
void adjust_cursor_col(void) void adjust_cursor_col(void)

View File

@ -6770,13 +6770,8 @@ static void stop_insert(pos_T *end_insert_pos, int esc, int nomove)
// <C-S-Right> may have started Visual mode, adjust the position for // <C-S-Right> may have started Visual mode, adjust the position for
// deleted characters. // deleted characters.
if (VIsual_active && VIsual.lnum == curwin->w_cursor.lnum) { if (VIsual_active) {
int len = (int)STRLEN(get_cursor_line_ptr()); check_visual_pos();
if (VIsual.col > len) {
VIsual.col = len;
VIsual.coladd = 0;
}
} }
} }
} }

View File

@ -1258,6 +1258,16 @@ func Test_visual_block_append_invalid_char()
set isprint& set isprint&
endfunc endfunc
func Test_visual_block_with_substitute()
" this was reading beyond the end of the line
new
norm a0)
sil! norm  O
s/)
sil! norm 
bwipe!
endfunc
func Test_visual_reselect_with_count() func Test_visual_reselect_with_count()
" this was causing an illegal memory access " this was causing an illegal memory access
let lines =<< trim END let lines =<< trim END