Skip to content

Commit

Permalink
patch 9.1.0406: Divide by zero with getmousepos() and 'smoothscroll'
Browse files Browse the repository at this point in the history
Problem:  Divide by zero with getmousepos() and 'smoothscroll'.
Solution: Don't compute skip_lines when width1 is zero.
          (zeertzjq)

closes: #14747

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
  • Loading branch information
zeertzjq authored and chrisbra committed May 11, 2024
1 parent 1c5728e commit 031a745
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 10 deletions.
22 changes: 14 additions & 8 deletions src/mouse.c
Expand Up @@ -3029,16 +3029,22 @@ mouse_comp_pos(

if (win->w_skipcol > 0 && lnum == win->w_topline)
{
// Adjust for 'smoothscroll' clipping the top screen lines.
// A similar formula is used in curs_columns().
int width1 = win->w_width - win_col_off(win);
int skip_lines = 0;
if (win->w_skipcol > width1)
skip_lines = (win->w_skipcol - width1)

if (width1 > 0)
{
int skip_lines = 0;

// Adjust for 'smoothscroll' clipping the top screen lines.
// A similar formula is used in curs_columns().
if (win->w_skipcol > width1)
skip_lines = (win->w_skipcol - width1)
/ (width1 + win_col_off2(win)) + 1;
else if (win->w_skipcol > 0)
skip_lines = 1;
count -= skip_lines;
else if (win->w_skipcol > 0)
skip_lines = 1;

count -= skip_lines;
}
}

if (count > row)
Expand Down
6 changes: 4 additions & 2 deletions src/move.c
Expand Up @@ -2617,12 +2617,14 @@ scroll_cursor_bot(int min_scroll, int set_topbot)
plines_win
#endif
(curwin, curwin->w_topline, FALSE);
int skip_lines = 0;
int width1 = curwin->w_width - curwin_col_off();

if (width1 > 0)
{
int width2 = width1 + curwin_col_off2();
// similar formula is used in curs_columns()
int skip_lines = 0;

// A similar formula is used in curs_columns().
if (curwin->w_skipcol > width1)
skip_lines += (curwin->w_skipcol - width1) / width2 + 1;
else if (curwin->w_skipcol > 0)
Expand Down
67 changes: 67 additions & 0 deletions src/testdir/test_functions.vim
Expand Up @@ -3697,6 +3697,73 @@ func Test_getmousepos()
\ column: 8,
\ coladd: 21,
\ }, getmousepos())

30vnew
setlocal smoothscroll number
call setline(1, join(range(100)))
exe "normal! \<C-E>"
call test_setmouse(1, 5)
call assert_equal(#{
\ screenrow: 1,
\ screencol: 5,
\ winid: win_getid(),
\ winrow: 1,
\ wincol: 5,
\ line: 1,
\ column: 27,
\ coladd: 0,
\ }, getmousepos())
call test_setmouse(2, 5)
call assert_equal(#{
\ screenrow: 2,
\ screencol: 5,
\ winid: win_getid(),
\ winrow: 2,
\ wincol: 5,
\ line: 1,
\ column: 53,
\ coladd: 0,
\ }, getmousepos())

exe "normal! \<C-E>"
call test_setmouse(1, 5)
call assert_equal(#{
\ screenrow: 1,
\ screencol: 5,
\ winid: win_getid(),
\ winrow: 1,
\ wincol: 5,
\ line: 1,
\ column: 53,
\ coladd: 0,
\ }, getmousepos())
call test_setmouse(2, 5)
call assert_equal(#{
\ screenrow: 2,
\ screencol: 5,
\ winid: win_getid(),
\ winrow: 2,
\ wincol: 5,
\ line: 1,
\ column: 79,
\ coladd: 0,
\ }, getmousepos())

vert resize 4
call test_setmouse(2, 2)
" This used to crash Vim
call assert_equal(#{
\ screenrow: 2,
\ screencol: 2,
\ winid: win_getid(),
\ winrow: 2,
\ wincol: 2,
\ line: 1,
\ column: 53,
\ coladd: 0,
\ }, getmousepos())

bwipe!
bwipe!
endfunc

Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -704,6 +704,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
406,
/**/
405,
/**/
Expand Down

0 comments on commit 031a745

Please sign in to comment.