vim-patch:8.0.1433: illegal memory access after undo

Problem:    Illegal memory access after undo. (Dominique Pelle)
Solution:   Avoid the column becomes negative. (Christian Brabandt,
            closes vim/vim#2533)
95dbcbea6d
This commit is contained in:
Jan Edmund Lazo 2018-08-09 15:14:09 -04:00
parent 4e963f2462
commit 6853690c78
3 changed files with 17 additions and 2 deletions

View File

@ -1465,7 +1465,11 @@ void mark_mb_adjustpos(buf_T *buf, pos_T *lp)
{ {
if (lp->col > 0 || lp->coladd > 1) { if (lp->col > 0 || lp->coladd > 1) {
const char_u *const p = ml_get_buf(buf, lp->lnum, false); const char_u *const p = ml_get_buf(buf, lp->lnum, false);
lp->col -= (*mb_head_off)(p, p + lp->col); if (*p == NUL || (int)STRLEN(p) < lp->col) {
lp->col = 0;
} else {
lp->col -= (*mb_head_off)(p, p + lp->col);
}
// Reset "coladd" when the cursor would be on the right half of a // Reset "coladd" when the cursor would be on the right half of a
// double-wide character. // double-wide character.
if (lp->coladd == 1 if (lp->coladd == 1

View File

@ -566,7 +566,9 @@ int utf_off2cells(unsigned off, unsigned max_off)
/// Convert a UTF-8 byte sequence to a wide character /// Convert a UTF-8 byte sequence to a wide character
/// ///
/// If the sequence is illegal or truncated by a NUL then the first byte is /// If the sequence is illegal or truncated by a NUL then the first byte is
/// returned. Does not include composing characters for obvious reasons. /// returned.
/// For an overlong sequence this may return zero.
/// Does not include composing characters for obvious reasons.
/// ///
/// @param[in] p String to convert. /// @param[in] p String to convert.
/// ///

View File

@ -348,3 +348,12 @@ func Test_redo_empty_line()
exe "norm." exe "norm."
bwipe! bwipe!
endfunc endfunc
" This used to cause an illegal memory access
func Test_undo_append()
new
call feedkeys("axx\<Esc>v", 'xt')
undo
norm o
quit
endfunc