changeset 27072:0878d7c64140 v8.2.4065

patch 8.2.4065: computation overflow with large cound for :yank Commit: https://github.com/vim/vim/commit/3cf21b305104e91a28e4ce3a473672b2e88a9469 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Jan 11 19:34:16 2022 +0000 patch 8.2.4065: computation overflow with large cound for :yank Problem: Computation overflow with large cound for :yank. Solution: Avoid an overflow.
author Bram Moolenaar <Bram@vim.org>
date Tue, 11 Jan 2022 20:45:02 +0100
parents 04adc77bb4b8
children 4ab8aec1b847
files src/ex_docmd.c src/testdir/test_excmd.vim src/version.c
diffstat 3 files changed, 12 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -2374,7 +2374,10 @@ do_one_cmd(
 	else
 	{
 	    ea.line1 = ea.line2;
-	    ea.line2 += n - 1;
+	    if (ea.line2 >= LONG_MAX - (n - 1))
+	        ea.line2 = LONG_MAX;  // avoid overflow
+	    else
+		ea.line2 += n - 1;
 	    ++ea.addr_count;
 	    /*
 	     * Be vi compatible: no error message for out of range.
--- a/src/testdir/test_excmd.vim
+++ b/src/testdir/test_excmd.vim
@@ -704,9 +704,14 @@ func Test_address_line_overflow()
     throw 'Skipped: only works with 64 bit long ints'
   endif
   new
-  call setline(1, 'text')
+  call setline(1, range(100))
   call assert_fails('|.44444444444444444444444', 'E1247:')
   call assert_fails('|.9223372036854775806', 'E1247:')
+
+  $
+  yank 77777777777777777777
+  call assert_equal("99\n", @")
+
   bwipe!
 endfunc
 
--- 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 */
 /**/
+    4065,
+/**/
     4064,
 /**/
     4063,