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