changeset 24561:f6049d3ab81c v8.2.2820

patch 8.2.2820: session file may divide by zero Commit: https://github.com/vim/vim/commit/b6c2e9a010ebd7db586081957e634903d4972fa1 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Apr 30 21:37:51 2021 +0200 patch 8.2.2820: session file may divide by zero Problem: Session file may divide by zero. Solution: Avoid writing difide by zero. (closes https://github.com/vim/vim/issues/8162)
author Bram Moolenaar <Bram@vim.org>
date Fri, 30 Apr 2021 21:45:05 +0200
parents dec4794e5af6
children 557e50935ce4
files src/session.c src/testdir/test_mksession.vim src/version.c
diffstat 3 files changed, 27 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/session.c
+++ b/src/session.c
@@ -456,11 +456,19 @@ put_view(
 
 	// Restore the cursor line in the file and relatively in the
 	// window.  Don't use "G", it changes the jumplist.
-	if (fprintf(fd, "let s:l = %ld - ((%ld * winheight(0) + %ld) / %ld)",
+	if (wp->w_height <= 0)
+	{
+	    if (fprintf(fd, "let s:l = %ld", (long)wp->w_cursor.lnum) < 0)
+		return FAIL;
+	}
+	else if (fprintf(fd,
+		    "let s:l = %ld - ((%ld * winheight(0) + %ld) / %ld)",
 		    (long)wp->w_cursor.lnum,
 		    (long)(wp->w_cursor.lnum - wp->w_topline),
-		    (long)wp->w_height / 2, (long)wp->w_height) < 0
-		|| put_eol(fd) == FAIL
+		    (long)wp->w_height / 2, (long)wp->w_height) < 0)
+	    return FAIL;
+
+	if (put_eol(fd) == FAIL
 		|| put_line(fd, "if s:l < 1 | let s:l = 1 | endif") == FAIL
 		|| put_line(fd, "keepjumps exe s:l") == FAIL
 		|| put_line(fd, "normal! zt") == FAIL
--- a/src/testdir/test_mksession.vim
+++ b/src/testdir/test_mksession.vim
@@ -179,6 +179,20 @@ 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()
+  "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()
   " TODO: fix problem with backslashes on Win32
   CheckNotMSWindows
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2820,
+/**/
     2819,
 /**/
     2818,