diff src/fold.c @ 17787:92e0996e1cb8 v8.1.1890

patch 8.1.1890: ml_get error when deleting fold marker commit https://github.com/vim/vim/commit/9a4a8c4d5993c6371486c895a515c2ad351e9aaa Author: Bram Moolenaar <Bram@vim.org> Date: Mon Aug 19 22:48:30 2019 +0200 patch 8.1.1890: ml_get error when deleting fold marker Problem: Ml_get error when deleting fold marker. Solution: Check that the line number is not below the last line. Adjust the fold when deleting the empty line. (Christian Brabandt, closes #4834)
author Bram Moolenaar <Bram@vim.org>
date Mon, 19 Aug 2019 23:00:05 +0200
parents ef00b6bc186b
children ba63a184e6b6
line wrap: on
line diff
--- a/src/fold.c
+++ b/src/fold.c
@@ -1813,7 +1813,7 @@ deleteFoldMarkers(
 /*
  * Delete marker "marker[markerlen]" at the end of line "lnum".
  * Delete 'commentstring' if it matches.
- * If the marker is not found, there is no error message.  Could a missing
+ * If the marker is not found, there is no error message.  Could be a missing
  * close-marker.
  */
     static void
@@ -1826,6 +1826,9 @@ foldDelMarker(linenr_T lnum, char_u *mar
     char_u	*cms = curbuf->b_p_cms;
     char_u	*cms2;
 
+    // end marker may be missing and fold extends below the last line
+    if (lnum > curbuf->b_ml.ml_line_count)
+	return;
     line = ml_get(lnum);
     for (p = line; *p != NUL; ++p)
 	if (STRNCMP(p, marker, markerlen) == 0)
@@ -2733,16 +2736,19 @@ foldUpdateIEMSRecurse(
      * lvl >= level: fold continues below "bot"
      */
 
-    /* Current fold at least extends until lnum. */
+    // Current fold at least extends until lnum.
     if (fp->fd_len < flp->lnum - fp->fd_top)
     {
 	fp->fd_len = flp->lnum - fp->fd_top;
 	fp->fd_small = MAYBE;
 	fold_changed = TRUE;
     }
-
-    /* Delete contained folds from the end of the last one found until where
-     * we stopped looking. */
+    else if (fp->fd_top + fp->fd_len > linecount)
+	// running into the end of the buffer (deleted last line)
+	fp->fd_len = linecount - fp->fd_top + 1;
+
+    // Delete contained folds from the end of the last one found until where
+    // we stopped looking.
     foldRemove(&fp->fd_nested, startlnum2 - fp->fd_top,
 						  flp->lnum - 1 - fp->fd_top);