changeset 22099:b7cc5d8ea702 v8.2.1599

patch 8.2.1599: missing line end when skipping a long line with :cgetfile Commit: https://github.com/vim/vim/commit/59941cbd8035415d68683edc4e571306b10669ad Author: Bram Moolenaar <Bram@vim.org> Date: Sat Sep 5 17:03:40 2020 +0200 patch 8.2.1599: missing line end when skipping a long line with :cgetfile Problem: Missing line end when skipping a long line with :cgetfile. Solution: Fix off-by-one error. (closes https://github.com/vim/vim/issues/6870)
author Bram Moolenaar <Bram@vim.org>
date Sat, 05 Sep 2020 17:15:03 +0200
parents 17faee57791f
children bb0a4e51c4c5
files src/quickfix.c src/testdir/test_quickfix.vim src/version.c
diffstat 3 files changed, 21 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -810,7 +810,7 @@ qf_get_next_file_line(qfstate_T *state)
 	    // reached.
 	    if (fgets((char *)IObuff, IOSIZE, state->fd) == NULL
 		    || (int)STRLEN(IObuff) < IOSIZE - 1
-		    || IObuff[IOSIZE - 1] == '\n')
+		    || IObuff[IOSIZE - 2] == '\n')
 		break;
 	}
 
--- a/src/testdir/test_quickfix.vim
+++ b/src/testdir/test_quickfix.vim
@@ -1744,6 +1744,24 @@ func Test_long_lines()
   call s:long_lines_tests('l')
 endfunc
 
+func Test_cgetfile_on_long_lines()
+  " Problematic values if the line is longer than 4096 bytes.  Then 1024 bytes
+  " are read at a time.
+  for len in [4078, 4079, 4080, 5102, 5103, 5104, 6126, 6127, 6128, 7150, 7151, 7152]
+    let lines = [
+      \ '/tmp/file1:1:1:aaa',
+      \ '/tmp/file2:1:1:%s',
+      \ '/tmp/file3:1:1:bbb',
+      \ '/tmp/file4:1:1:ccc',
+      \ ]
+    let lines[1] = substitute(lines[1], '%s', repeat('x', len), '')
+    call writefile(lines, 'Xcqetfile.txt')
+    cgetfile Xcqetfile.txt
+    call assert_equal(4, getqflist(#{size: v:true}).size, 'with length ' .. len)
+  endfor
+  call delete('Xcqetfile.txt')
+endfunc
+
 func s:create_test_file(filename)
   let l = []
   for i in range(1, 20)
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1599,
+/**/
     1598,
 /**/
     1597,