mirror of
https://github.com/vim/vim.git
synced 2025-09-27 04:14:06 -04:00
patch 8.2.2422: crash when deleting with line number out of range
Problem: Crash when deleting with line number out of range. (Houyunsong) Solution: Avoid using a negative line number.
This commit is contained in:
@@ -630,7 +630,7 @@ getcount:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
ca.count0 = ca.count0 * 10 + (c - '0');
|
ca.count0 = ca.count0 * 10 + (c - '0');
|
||||||
if (ca.count0 < 0) // got too large!
|
if (ca.count0 < 0) // overflow
|
||||||
ca.count0 = 999999999L;
|
ca.count0 = 999999999L;
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
// Set v:count here, when called from main() and not a stuffed
|
// Set v:count here, when called from main() and not a stuffed
|
||||||
@@ -701,6 +701,8 @@ getcount:
|
|||||||
ca.count0 *= ca.opcount;
|
ca.count0 *= ca.opcount;
|
||||||
else
|
else
|
||||||
ca.count0 = ca.opcount;
|
ca.count0 = ca.opcount;
|
||||||
|
if (ca.count0 < 0) // overflow
|
||||||
|
ca.count0 = 999999999L;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -4775,6 +4777,8 @@ nv_percent(cmdarg_T *cap)
|
|||||||
else
|
else
|
||||||
curwin->w_cursor.lnum = (curbuf->b_ml.ml_line_count *
|
curwin->w_cursor.lnum = (curbuf->b_ml.ml_line_count *
|
||||||
cap->count0 + 99L) / 100L;
|
cap->count0 + 99L) / 100L;
|
||||||
|
if (curwin->w_cursor.lnum < 1)
|
||||||
|
curwin->w_cursor.lnum = 1;
|
||||||
if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
|
if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
|
||||||
curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
|
curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
|
||||||
beginline(BL_SOL | BL_FIX);
|
beginline(BL_SOL | BL_FIX);
|
||||||
|
@@ -206,4 +206,20 @@ func Test_ex_mode_with_global()
|
|||||||
call delete('Xexmodescript')
|
call delete('Xexmodescript')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_ex_mode_count_overflow()
|
||||||
|
" this used to cause a crash
|
||||||
|
let lines =<< trim END
|
||||||
|
call feedkeys("\<Esc>Q\<CR>")
|
||||||
|
v9|9silent! vi|333333233333y32333333%O
|
||||||
|
call writefile(['done'], 'Xdidexmode')
|
||||||
|
qall!
|
||||||
|
END
|
||||||
|
call writefile(lines, 'Xexmodescript')
|
||||||
|
call assert_equal(1, RunVim([], [], '-e -s -S Xexmodescript -c qa'))
|
||||||
|
call assert_equal(['done'], readfile('Xdidexmode'))
|
||||||
|
|
||||||
|
call delete('Xdidexmode')
|
||||||
|
call delete('Xexmodescript')
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
2422,
|
||||||
/**/
|
/**/
|
||||||
2421,
|
2421,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user