aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2021-05-05 22:08:18 -0400
committerJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2021-05-05 22:50:57 -0400
commit44a331c36b5af25e51b072e8e77c478c2540ff43 (patch)
tree473a977099f1d196f21c179f846459cfe2db0277
parentdd935e147344d90d42710c144822259a6af6f090 (diff)
downloadrneovim-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.c23
-rw-r--r--src/nvim/testdir/test_mksession.vim15
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