diff options
author | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2021-05-05 22:08:18 -0400 |
---|---|---|
committer | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2021-05-05 22:50:57 -0400 |
commit | 44a331c36b5af25e51b072e8e77c478c2540ff43 (patch) | |
tree | 473a977099f1d196f21c179f846459cfe2db0277 | |
parent | dd935e147344d90d42710c144822259a6af6f090 (diff) | |
download | rneovim-44a331c36b5af25e51b072e8e77c478c2540ff43.tar.gz rneovim-44a331c36b5af25e51b072e8e77c478c2540ff43.tar.bz2 rneovim-44a331c36b5af25e51b072e8e77c478c2540ff43.zip |
vim-patch:8.2.2820: session file may divide by zero
Problem: Session file may divide by zero.
Solution: Avoid writing difide by zero. (closes vim/vim#8162)
https://github.com/vim/vim/commit/b6c2e9a010ebd7db586081957e634903d4972fa1
Avoid typecasts if possible.
Use PRIdLINENR, PRId64, to format line numbers.
-rw-r--r-- | src/nvim/ex_session.c | 23 | ||||
-rw-r--r-- | src/nvim/testdir/test_mksession.vim | 15 |
2 files changed, 30 insertions, 8 deletions
diff --git a/src/nvim/ex_session.c b/src/nvim/ex_session.c index b11ec4ad05..9e4e69e124 100644 --- a/src/nvim/ex_session.c +++ b/src/nvim/ex_session.c @@ -447,18 +447,25 @@ static int put_view( if (do_cursor) { // Restore the cursor line in the file and relatively in the // window. Don't use "G", it changes the jumplist. + if (wp->w_height_inner <= 0) { + if (fprintf(fd, "let s:l = %" PRIdLINENR "\n", wp->w_cursor.lnum) < 0) { + return FAIL; + } + } else if (fprintf(fd, + "let s:l = %" PRIdLINENR " - ((%" PRIdLINENR + " * winheight(0) + %" PRId64 ") / %" PRId64 ")\n", + wp->w_cursor.lnum, + wp->w_cursor.lnum - wp->w_topline, + (int64_t)(wp->w_height_inner / 2), + (int64_t)wp->w_height_inner) < 0) { + return FAIL; + } if (fprintf(fd, - "let s:l = %" PRId64 " - ((%" PRId64 - " * winheight(0) + %" PRId64 ") / %" PRId64 ")\n" "if s:l < 1 | let s:l = 1 | endif\n" "keepjumps exe s:l\n" "normal! zt\n" - "keepjumps %" PRId64 "\n", - (int64_t)wp->w_cursor.lnum, - (int64_t)(wp->w_cursor.lnum - wp->w_topline), - (int64_t)(wp->w_height_inner / 2), - (int64_t)wp->w_height_inner, - (int64_t)wp->w_cursor.lnum) < 0) { + "keepjumps %" PRIdLINENR "\n", + wp->w_cursor.lnum) < 0) { return FAIL; } // Restore the cursor column and left offset when not wrapping. diff --git a/src/nvim/testdir/test_mksession.vim b/src/nvim/testdir/test_mksession.vim index 7bb76ad9eb..d7cb4e743c 100644 --- a/src/nvim/testdir/test_mksession.vim +++ b/src/nvim/testdir/test_mksession.vim @@ -149,6 +149,21 @@ func Test_mksession_large_winheight() call delete('Xtest_mks_winheight.out') endfunc +func Test_mksession_zero_winheight() + set winminheight=0 + edit SomeFile + split + wincmd _ + mksession! Xtest_mks_zero + set winminheight& + " let text = readfile('Xtest_mks_zero')->join() + let text = join(readfile('Xtest_mks_zero')) + "call delete('Xtest_mks_zero') + close + " check there is no devide by zero + call assert_notmatch('/ 0[^0-9]', text) +endfunc + func Test_mksession_rtp() if has('win32') " TODO: fix problem with backslashes |