patch 9.2.0024: Reading files with very long lines crashes with a segfault

Problem:  Reading files with lines approaching MAXCOL length crashes
          with segfault due to colnr_T overflow.
Solution: The split check 'linerest >= MAXCOL' fired too late because
          linerest could grow by up to 'size' bytes before the next
          check. Change threshold to 'linerest >= MAXCOL - size' to
          ensure the line passed to ml_append() stays within colnr_T
          range.

Note: supported by AI claude

fixes:   #17935
closes:  #18953
closes:  #19332

Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Christian Brabandt
2026-02-18 21:52:40 +00:00
parent 0ece393844
commit 6cc291da06
2 changed files with 8 additions and 1 deletions
+6 -1
View File
@@ -1170,7 +1170,12 @@ retry:
}
// Protect against the argument of lalloc() going negative.
if (size < 0 || size + linerest + 1 < 0 || linerest >= MAXCOL)
// Also split lines that are too long for colnr_T. After this check
// passes, we read up to 'size' more bytes. We must ensure that even
// after that read, the line length won't exceed MAXCOL - 1 (because
// we add 1 for the NUL when casting to colnr_T). If this check fires,
// we insert a synthetic newline immediately, so linerest doesn't grow.
if (size < 0 || size + linerest + 1 < 0 || linerest >= MAXCOL - size)
{
++split;
*ptr = NL; // split line by inserting a NL
+2
View File
@@ -734,6 +734,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
24,
/**/
23,
/**/