]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.2.0024: Reading files with very long lines crashes with a segfault v9.2.0024
authorChristian Brabandt <cb@256bit.org>
Wed, 18 Feb 2026 21:52:40 +0000 (21:52 +0000)
committerChristian Brabandt <cb@256bit.org>
Wed, 18 Feb 2026 21:52:40 +0000 (21:52 +0000)
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>
src/fileio.c
src/version.c

index 9aceaf887637b9db328f18993697a1c21a6bd4c1..1f372c39e3c14e3029866e9de005ce33b984bcdf 100644 (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
index 965ce4b9e31ea26a1083708f5676509e38e5ea85..6618340d75d62f4277d49281861fd2d36c594b1f 100644 (file)
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    24,
 /**/
     23,
 /**/