]> granicus.if.org Git - vim/commitdiff
patch 8.2.5043: can open a cmdline window from a substitute expression v8.2.5043
authorBram Moolenaar <Bram@vim.org>
Mon, 30 May 2022 14:23:09 +0000 (15:23 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 30 May 2022 14:23:09 +0000 (15:23 +0100)
Problem:    Can open a cmdline window from a substitute expression.
Solution:   Disallow opening a command line window when text or buffer is
            locked.

src/buffer.c
src/ex_getln.c
src/proto/ex_getln.pro
src/testdir/test_substitute.vim
src/version.c
src/window.c

index efec431c822dfe49b2475df4827332c1b096a325..e775398d02949b21c0a20c0feb1d0be8a514c65b 100644 (file)
@@ -2407,12 +2407,7 @@ buflist_getfile(
     if (buf == curbuf)
        return OK;
 
-    if (text_locked())
-    {
-       text_locked_msg();
-       return FAIL;
-    }
-    if (curbuf_locked())
+    if (text_or_buf_locked())
        return FAIL;
 
     // altfpos may be changed by getfile(), get it now
index 9dadfbf2fabebfaebea009e9eb1abc07ad8dc7de..623bd1d4984a495fd3ef0d4aa4f05abc04c4f8ea 100644 (file)
@@ -2739,6 +2739,21 @@ get_text_locked_msg(void)
     return e_not_allowed_to_change_text_or_change_window;
 }
 
+/*
+ * Check for text, window or buffer locked.
+ * Give an error message and return TRUE if something is locked.
+ */
+    int
+text_or_buf_locked(void)
+{
+    if (text_locked())
+    {
+       text_locked_msg();
+       return TRUE;
+    }
+    return curbuf_locked();
+}
+
 /*
  * Check if "curbuf_lock" or "allbuf_lock" is set and return TRUE when it is
  * and give an error message.
@@ -4379,6 +4394,10 @@ open_cmdwin(void)
     int                        save_KeyTyped;
 #endif
 
+    // Can't do this when text or buffer is locked.
+    if (text_or_buf_locked())
+       return K_IGNORE;
+
     // Can't do this recursively.  Can't do it when typing a password.
     if (cmdwin_type != 0
 # if defined(FEAT_CRYPT) || defined(FEAT_EVAL)
index 8c8bd0ebd4cd93c66c647caec1773449e5977133..bcc310c7dd0e28965b9fd42b8979b99d602a8aa4 100644 (file)
@@ -3,9 +3,10 @@ void cmdline_init(void);
 char_u *getcmdline(int firstc, long count, int indent, getline_opt_T do_concat);
 char_u *getcmdline_prompt(int firstc, char_u *prompt, int attr, int xp_context, char_u *xp_arg);
 int check_opt_wim(void);
+int text_locked(void);
 void text_locked_msg(void);
 char *get_text_locked_msg(void);
-int text_locked(void);
+int text_or_buf_locked(void);
 int curbuf_locked(void);
 int allbuf_locked(void);
 char_u *getexline(int c, void *cookie, int indent, getline_opt_T options);
@@ -32,8 +33,8 @@ cmdline_info_T *get_cmdline_info(void);
 void f_getcmdcompltype(typval_T *argvars, typval_T *rettv);
 void f_getcmdline(typval_T *argvars, typval_T *rettv);
 void f_getcmdpos(typval_T *argvars, typval_T *rettv);
-void f_setcmdpos(typval_T *argvars, typval_T *rettv);
 void f_getcmdscreenpos(typval_T *argvars, typval_T *rettv);
+void f_setcmdpos(typval_T *argvars, typval_T *rettv);
 void f_getcmdtype(typval_T *argvars, typval_T *rettv);
 int get_cmdline_firstc(void);
 int get_list_range(char_u **str, int *num1, int *num2);
index c8df09f4ec1ebeb67e8792e734d247b2edcf0ca7..3c87fafe74cf09db7eca3efaa9ec7e5aa619835f 100644 (file)
@@ -1035,6 +1035,31 @@ func Test_sub_undo_change()
   delfunc Repl
 endfunc
 
+" This was opening a command line window from the expression
+func Test_sub_open_cmdline_win()
+  " the error only happens in a very specific setup, run a new Vim instance to
+  " get a clean starting point.
+  let lines =<< trim [SCRIPT]
+    norm o0000000000000000000000000000000000000000000000000000
+    func Replace()
+      norm q/
+    endfunc
+    s/\%')/\=Replace()
+    redir >Xresult
+    messages
+    redir END
+    qall!
+  [SCRIPT]
+  call writefile(lines, 'Xscript')
+  if RunVim([], [], '-u NONE -S Xscript')
+    let messages = readfile('Xresult')
+    call assert_match('E565: Not allowed to change text or change window', messages[3])
+  endif
+
+  call delete('Xscript')
+  call delete('Xresult')
+endfunc
+
 " Test for the 2-letter and 3-letter :substitute commands
 func Test_substitute_short_cmd()
   new
index 18a1fdb41cb6f67caff69d4281204c67899316ff..a15bb3ed8d6a6fcf436133d9117c5c24d578d83f 100644 (file)
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    5043,
 /**/
     5042,
 /**/
index f2913d4a76ef3a212a75b5aade649a30db1e6667..9b5ac97286cdc776dd4a8c71f6b3cfb247276566 100644 (file)
@@ -4585,14 +4585,11 @@ win_goto(win_T *wp)
        return;
     }
 #endif
-    if (text_locked())
+    if (text_or_buf_locked())
     {
        beep_flush();
-       text_locked_msg();
        return;
     }
-    if (curbuf_locked())
-       return;
 
     if (wp->w_buffer != curbuf)
        reset_VIsual_and_resel();