Blame SOURCES/0001-patch-8.2.5023-substitute-overwrites-allocated-buffe.patch

3e779a
diff -up vim80/src/normal.c.cve1897 vim80/src/normal.c
3e779a
--- vim80/src/normal.c.cve1897	2022-06-13 14:50:22.800290132 +0200
3e779a
+++ vim80/src/normal.c	2022-06-13 14:55:06.082861349 +0200
3e779a
@@ -532,6 +532,22 @@ find_command(int cmdchar)
3e779a
 }
3e779a
 
3e779a
 /*
3e779a
+ * If currently editing a cmdline or text is locked: beep and give an error
3e779a
+ * message, return TRUE.
3e779a
+ */
3e779a
+    static int
3e779a
+check_text_locked(oparg_T *oap)
3e779a
+{
3e779a
+    if (text_locked())
3e779a
+    {
3e779a
+	clearopbeep(oap);
3e779a
+	text_locked_msg();
3e779a
+	return TRUE;
3e779a
+    }
3e779a
+    return FALSE;
3e779a
+}
3e779a
+
3e779a
+/*
3e779a
  * Execute a command in Normal mode.
3e779a
  */
3e779a
     void
3e779a
@@ -792,14 +808,9 @@ getcount:
3e779a
 	goto normal_end;
3e779a
     }
3e779a
 
3e779a
-    if (text_locked() && (nv_cmds[idx].cmd_flags & NV_NCW))
3e779a
-    {
3e779a
-	/* This command is not allowed while editing a cmdline: beep. */
3e779a
-	clearopbeep(oap);
3e779a
-	text_locked_msg();
3e779a
-	goto normal_end;
3e779a
-    }
3e779a
-    if ((nv_cmds[idx].cmd_flags & NV_NCW) && curbuf_locked())
3e779a
+    if ((nv_cmds[idx].cmd_flags & NV_NCW)
3e779a
+				&& (check_text_locked(oap) || curbuf_locked()))
3e779a
+	// this command is not allowed now
3e779a
 	goto normal_end;
3e779a
 
3e779a
     /*
3e779a
@@ -6234,12 +6245,8 @@ nv_gotofile(cmdarg_T *cap)
3e779a
     char_u	*ptr;
3e779a
     linenr_T	lnum = -1;
3e779a
 
3e779a
-    if (text_locked())
3e779a
-    {
3e779a
-	clearopbeep(cap->oap);
3e779a
-	text_locked_msg();
3e779a
+    if (check_text_locked(cap->oap))
3e779a
 	return;
3e779a
-    }
3e779a
     if (curbuf_locked())
3e779a
     {
3e779a
 	clearop(cap->oap);
3e779a
@@ -8420,14 +8427,7 @@ nv_g_cmd(cmdarg_T *cap)
3e779a
 
3e779a
     /* "gQ": improved Ex mode */
3e779a
     case 'Q':
3e779a
-	if (text_locked())
3e779a
-	{
3e779a
-	    clearopbeep(cap->oap);
3e779a
-	    text_locked_msg();
3e779a
-	    break;
3e779a
-	}
3e779a
-
3e779a
-	if (!checkclearopq(oap))
3e779a
+	if (!check_text_locked(cap->oap) && !checkclearopq(oap))
3e779a
 	    do_exmode(TRUE);
3e779a
 	break;
3e779a
 
3e779a
diff -up vim80/src/testdir/test_substitute.vim.cve1897 vim80/src/testdir/test_substitute.vim
3e779a
--- vim80/src/testdir/test_substitute.vim.cve1897	2022-06-13 14:50:22.849290402 +0200
3e779a
+++ vim80/src/testdir/test_substitute.vim	2022-06-13 14:55:50.370111134 +0200
3e779a
@@ -513,3 +513,26 @@ func Test_sub_change_window()
3e779a
   bwipe!
3e779a
   delfunc Repl
3e779a
 endfunc
3e779a
+
3e779a
+" This was undoign a change in between computing the length and using it.
3e779a
+func Do_Test_sub_undo_change()
3e779a
+  new
3e779a
+  norm o0000000000000000000000000000000000000000000000000000
3e779a
+  silent! s/\%')/\=Repl()
3e779a
+  bwipe!
3e779a
+endfunc
3e779a
+
3e779a
+func Test_sub_undo_change()
3e779a
+  func Repl()
3e779a
+    silent! norm g-
3e779a
+  endfunc
3e779a
+  call Do_Test_sub_undo_change()
3e779a
+
3e779a
+  func! Repl()
3e779a
+    silent earlier
3e779a
+  endfunc
3e779a
+  call Do_Test_sub_undo_change()
3e779a
+
3e779a
+  delfunc Repl
3e779a
+endfunc
3e779a
+
3e779a
diff -up vim80/src/undo.c.cve1897 vim80/src/undo.c
3e779a
--- vim80/src/undo.c.cve1897	2022-06-13 14:50:22.849290402 +0200
3e779a
+++ vim80/src/undo.c	2022-06-13 14:56:57.916492090 +0200
3e779a
@@ -2283,6 +2283,12 @@ undo_time(
3e779a
     if (curbuf->b_u_synced == FALSE)
3e779a
 	u_sync(TRUE);
3e779a
 
3e779a
+    if (text_locked())
3e779a
+    {
3e779a
+	text_locked_msg();
3e779a
+	return;
3e779a
+    }
3e779a
+
3e779a
     u_newcount = 0;
3e779a
     u_oldcount = 0;
3e779a
     if (curbuf->b_ml.ml_flags & ML_EMPTY)