# HG changeset patch # User Bram Moolenaar # Date 1687640404 -7200 # Node ID 23e24f3cae0323850a221fc6c59b1c8f326cd1d8 # Parent 3ca4b0fb58e81999e0423f8c272667feef0953fe patch 9.0.1664: divide by zero when scrolling with 'smoothscroll' set Commit: https://github.com/vim/vim/commit/8154e642aa476e1a5d3de66c34e8289845b2b797 Author: fullwaywang Date: Sat Jun 24 21:58:09 2023 +0100 patch 9.0.1664: divide by zero when scrolling with 'smoothscroll' set Problem: Divide by zero when scrolling with 'smoothscroll' set. Solution: Avoid using a negative width. (closes https://github.com/vim/vim/issues/12540, closes https://github.com/vim/vim/issues/12528) diff --git a/src/move.c b/src/move.c --- a/src/move.c +++ b/src/move.c @@ -2591,17 +2591,20 @@ scroll_cursor_bot(int min_scroll, int se (curwin, curwin->w_topline, FALSE); int skip_lines = 0; int width1 = curwin->w_width - curwin_col_off(); - int width2 = width1 + curwin_col_off2(); - // 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) - skip_lines = 1; + if (width1 > 0) + { + int width2 = width1 + curwin_col_off2(); + // 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) + skip_lines = 1; - top_plines -= skip_lines; - if (top_plines > curwin->w_height) - { - scrolled += (top_plines - curwin->w_height); + top_plines -= skip_lines; + if (top_plines > curwin->w_height) + { + scrolled += (top_plines - curwin->w_height); + } } } } diff --git a/src/testdir/dumps/Test_smoothscroll_zero_bot.dump b/src/testdir/dumps/Test_smoothscroll_zero_bot.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_smoothscroll_zero_bot.dump @@ -0,0 +1,19 @@ +| +0#af5f00255#ffffff0||+1#0000000&| +0&&@9 +|@+0#4040ff13&||+1#0000000&| +0&&@9 +|@+0#4040ff13&||+1#0000000&| +0&&@9 +|@+0#4040ff13&||+1#0000000&| +0&&@9 +|@+0#4040ff13&||+1#0000000&| +0&&@9 +|@+0#4040ff13&||+1#0000000&| +0&&@9 +|@+0#4040ff13&||+1#0000000&| +0&&@9 +|@+0#4040ff13&||+1#0000000&| +0&&@9 +|@+0#4040ff13&||+1#0000000&| +0&&@9 +|@+0#4040ff13&||+1#0000000&| +0&&@9 +|@+0#4040ff13&||+1#0000000&| +0&&@9 +|@+0#4040ff13&||+1#0000000&| +0&&@9 +|@+0#4040ff13&||+1#0000000&| +0&&@9 +|@+0#4040ff13&||+1#0000000&| +0&&@9 +|@+0#4040ff13&||+1#0000000&| +0&&@9 +|@+0#4040ff13&||+1#0000000&| +0&&@9 +>@+0#4040ff13&||+1#0000000&| +0&&@9 +|<+3&&| |<+1&&|a|m|e|]| |[|+|]| +| +0&&@11 diff --git a/src/testdir/test_scroll_opt.vim b/src/testdir/test_scroll_opt.vim --- a/src/testdir/test_scroll_opt.vim +++ b/src/testdir/test_scroll_opt.vim @@ -833,4 +833,28 @@ func Test_smoothscroll_multi_skipcol() call StopVimInTerminal(buf) endfunc +" this was dividing by zero bug in scroll_cursor_bot +func Test_smoothscroll_zero_width_scroll_cursor_bot() + CheckScreendump + + let lines =<< trim END + silent normal yy + silent normal 19p + winsize 0 19 + vsplit + vertical resize 0 + set foldcolumn=1 + set number + set smoothscroll + silent normal 20G + END + call writefile(lines, 'XSmoothScrollZeroBot', 'D') + let buf = RunVimInTerminal('-u NONE -S XSmoothScrollZeroBot', #{rows: 19, wait_for_ruler: 0}) + call TermWait(buf, 1000) + + call VerifyScreenDump(buf, 'Test_smoothscroll_zero_bot', {}) + + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1664, +/**/ 1663, /**/ 1662,