Mercurial > vim
changeset 32665:23e24f3cae03 v9.0.1664
patch 9.0.1664: divide by zero when scrolling with 'smoothscroll' set
Commit: https://github.com/vim/vim/commit/8154e642aa476e1a5d3de66c34e8289845b2b797
Author: fullwaywang <fullwaywang@tencent.com>
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 24 Jun 2023 23:00:04 +0200 |
parents | 3ca4b0fb58e8 |
children | f905f7bc568c |
files | src/move.c src/testdir/dumps/Test_smoothscroll_zero_bot.dump src/testdir/test_scroll_opt.vim src/version.c |
diffstat | 4 files changed, 58 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- 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); + } } } }
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
--- 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