Toshaan Bharvani
2 years ago
43 changed files with 984 additions and 578 deletions
@ -0,0 +1,110 @@ |
|||||||
|
From e3537aec2f8d6470010547af28dcbd83d41461b8 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Bram Moolenaar <Bram@vim.org> |
||||||
|
Date: Tue, 8 Feb 2022 15:05:20 +0000 |
||||||
|
Subject: [PATCH] patch 8.2.4327: may end up with no current buffer |
||||||
|
|
||||||
|
Problem: May end up with no current buffer. |
||||||
|
Solution: When deleting the current buffer to not pick a quickfix buffer as |
||||||
|
the new current buffer. |
||||||
|
--- |
||||||
|
src/buffer.c | 26 ++++++++++++++++++++++---- |
||||||
|
src/testdir/test_quickfix.vim | 25 +++++++++++++++++++++++++ |
||||||
|
src/version.c | 2 ++ |
||||||
|
3 files changed, 49 insertions(+), 4 deletions(-) |
||||||
|
|
||||||
|
diff --git a/src/buffer.c b/src/buffer.c |
||||||
|
index 81bdb31ca..b3e2bc3f9 100644 |
||||||
|
--- a/src/buffer.c |
||||||
|
+++ b/src/buffer.c |
||||||
|
@@ -1430,8 +1430,14 @@ do_buffer_ext( |
||||||
|
buf = buflist_findnr(curwin->w_jumplist[jumpidx].fmark.fnum); |
||||||
|
if (buf != NULL) |
||||||
|
{ |
||||||
|
- if (buf == curbuf || !buf->b_p_bl) |
||||||
|
- buf = NULL; // skip current and unlisted bufs |
||||||
|
+ // Skip current and unlisted bufs. Also skip a quickfix |
||||||
|
+ // buffer, it might be deleted soon. |
||||||
|
+ if (buf == curbuf || !buf->b_p_bl |
||||||
|
+#if defined(FEAT_QUICKFIX) |
||||||
|
+ || bt_quickfix(buf) |
||||||
|
+#endif |
||||||
|
+ ) |
||||||
|
+ buf = NULL; |
||||||
|
else if (buf->b_ml.ml_mfp == NULL) |
||||||
|
{ |
||||||
|
// skip unloaded buf, but may keep it for later |
||||||
|
@@ -1467,7 +1473,11 @@ do_buffer_ext( |
||||||
|
continue; |
||||||
|
} |
||||||
|
// in non-help buffer, try to skip help buffers, and vv |
||||||
|
- if (buf->b_help == curbuf->b_help && buf->b_p_bl) |
||||||
|
+ if (buf->b_help == curbuf->b_help && buf->b_p_bl |
||||||
|
+#if defined(FEAT_QUICKFIX) |
||||||
|
+ && !bt_quickfix(buf) |
||||||
|
+#endif |
||||||
|
+ ) |
||||||
|
{ |
||||||
|
if (buf->b_ml.ml_mfp != NULL) // found loaded buffer |
||||||
|
break; |
||||||
|
@@ -1485,7 +1495,11 @@ do_buffer_ext( |
||||||
|
if (buf == NULL) // No loaded buffer, find listed one |
||||||
|
{ |
||||||
|
FOR_ALL_BUFFERS(buf) |
||||||
|
- if (buf->b_p_bl && buf != curbuf) |
||||||
|
+ if (buf->b_p_bl && buf != curbuf |
||||||
|
+#if defined(FEAT_QUICKFIX) |
||||||
|
+ && !bt_quickfix(buf) |
||||||
|
+#endif |
||||||
|
+ ) |
||||||
|
break; |
||||||
|
} |
||||||
|
if (buf == NULL) // Still no buffer, just take one |
||||||
|
@@ -1494,6 +1508,10 @@ do_buffer_ext( |
||||||
|
buf = curbuf->b_next; |
||||||
|
else |
||||||
|
buf = curbuf->b_prev; |
||||||
|
+#if defined(FEAT_QUICKFIX) |
||||||
|
+ if (bt_quickfix(buf)) |
||||||
|
+ buf = NULL; |
||||||
|
+#endif |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim |
||||||
|
index 07fdb9644..adb0ea4fd 100644 |
||||||
|
--- a/src/testdir/test_quickfix.vim |
||||||
|
+++ b/src/testdir/test_quickfix.vim |
||||||
|
@@ -5851,5 +5851,30 @@ func Test_lopen_bwipe() |
||||||
|
delfunc R |
||||||
|
endfunc |
||||||
|
|
||||||
|
+" Another sequence of commands that caused all buffers to be wiped out |
||||||
|
+func Test_lopen_bwipe_all() |
||||||
|
+ let lines =<< trim END |
||||||
|
+ func R() |
||||||
|
+ silent! tab lopen |
||||||
|
+ e foo |
||||||
|
+ silent! lfile |
||||||
|
+ endfunc |
||||||
|
+ cal R() |
||||||
|
+ exe "norm \<C-W>\<C-V>0" |
||||||
|
+ cal R() |
||||||
|
+ bwipe |
||||||
|
+ |
||||||
|
+ call writefile(['done'], 'Xresult') |
||||||
|
+ qall! |
||||||
|
+ END |
||||||
|
+ call writefile(lines, 'Xscript') |
||||||
|
+ if RunVim([], [], '-u NONE -n -X -Z -e -m -s -S Xscript') |
||||||
|
+ call assert_equal(['done'], readfile('Xresult')) |
||||||
|
+ endif |
||||||
|
+ |
||||||
|
+ call delete('Xscript') |
||||||
|
+ call delete('Xresult') |
||||||
|
+endfunc |
||||||
|
+ |
||||||
|
|
||||||
|
" vim: shiftwidth=2 sts=2 expandtab |
||||||
|
-- |
||||||
|
2.35.1 |
||||||
|
|
@ -0,0 +1,44 @@ |
|||||||
|
diff -up vim82/src/regexp_bt.c.cve1154 vim82/src/regexp_bt.c |
||||||
|
--- vim82/src/regexp_bt.c.cve1154 2022-04-25 15:22:28.367621755 +0200 |
||||||
|
+++ vim82/src/regexp_bt.c 2022-04-25 15:25:13.726340728 +0200 |
||||||
|
@@ -3188,8 +3188,17 @@ regmatch( |
||||||
|
int mark = OPERAND(scan)[0]; |
||||||
|
int cmp = OPERAND(scan)[1]; |
||||||
|
pos_T *pos; |
||||||
|
+ size_t col = REG_MULTI ? rex.input - rex.line : 0; |
||||||
|
|
||||||
|
pos = getmark_buf(rex.reg_buf, mark, FALSE); |
||||||
|
+ |
||||||
|
+ // Line may have been freed, get it again. |
||||||
|
+ if (REG_MULTI) |
||||||
|
+ { |
||||||
|
+ rex.line = reg_getline(rex.lnum); |
||||||
|
+ rex.input = rex.line + col; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
if (pos == NULL // mark doesn't exist |
||||||
|
|| pos->lnum <= 0 // mark isn't set in reg_buf |
||||||
|
|| (pos->lnum == rex.lnum + rex.reg_firstlnum |
||||||
|
diff -up vim82/src/testdir/test_regexp_latin.vim.cve1154 vim82/src/testdir/test_regexp_latin.vim |
||||||
|
--- vim82/src/testdir/test_regexp_latin.vim.cve1154 2022-04-25 15:22:28.368621752 +0200 |
||||||
|
+++ vim82/src/testdir/test_regexp_latin.vim 2022-04-25 15:26:57.515227712 +0200 |
||||||
|
@@ -954,4 +954,19 @@ func Test_using_visual_position() |
||||||
|
bwipe! |
||||||
|
endfunc |
||||||
|
|
||||||
|
+func Test_using_mark_position() |
||||||
|
+ " this was using freed memory |
||||||
|
+ " new engine |
||||||
|
+ new |
||||||
|
+ norm O0 |
||||||
|
+ call assert_fails("s/\\%')", 'E486:') |
||||||
|
+ bwipe! |
||||||
|
+ |
||||||
|
+ " old engine |
||||||
|
+ new |
||||||
|
+ norm O0 |
||||||
|
+ call assert_fails("s/\\%#=1\\%')", 'E486:') |
||||||
|
+ bwipe! |
||||||
|
+endfunc |
||||||
|
+ |
||||||
|
" vim: shiftwidth=2 sts=2 expandtab |
@ -0,0 +1,51 @@ |
|||||||
|
diff -up vim82/src/errors.h.cve1420 vim82/src/errors.h |
||||||
|
--- vim82/src/errors.h.cve1420 2022-04-25 16:01:03.559985019 +0200 |
||||||
|
+++ vim82/src/errors.h 2022-04-25 16:01:58.113332024 +0200 |
||||||
|
@@ -383,3 +383,7 @@ EXTERN char e_cannot_use_default_values_ |
||||||
|
INIT(= N_("E1172: Cannot use default values in a lambda")); |
||||||
|
EXTERN char e_resulting_text_too_long[] |
||||||
|
INIT(= N_("E1240: Resulting text too long")); |
||||||
|
+#ifdef FEAT_EVAL |
||||||
|
+EXTERN char e_string_or_function_required_for_arrow_parens_expr[] |
||||||
|
+ INIT(= N_("E1275: String or function required for ->(expr)")); |
||||||
|
+#endif |
||||||
|
diff -up vim82/src/eval.c.cve1420 vim82/src/eval.c |
||||||
|
--- vim82/src/eval.c.cve1420 2022-04-25 16:01:03.560985007 +0200 |
||||||
|
+++ vim82/src/eval.c 2022-04-25 16:14:11.746600369 +0200 |
||||||
|
@@ -3718,13 +3718,20 @@ eval_lambda( |
||||||
|
if (**arg != ')') |
||||||
|
{ |
||||||
|
emsg(_(e_missing_close)); |
||||||
|
- ret = FAIL; |
||||||
|
+ return FAIL; |
||||||
|
+ } |
||||||
|
+ if (rettv->v_type != VAR_STRING && rettv->v_type != VAR_FUNC |
||||||
|
+ && rettv->v_type != VAR_PARTIAL) |
||||||
|
+ { |
||||||
|
+ emsg(_(e_string_or_function_required_for_arrow_parens_expr)); |
||||||
|
+ return FAIL; |
||||||
|
} |
||||||
|
++*arg; |
||||||
|
} |
||||||
|
if (ret != OK) |
||||||
|
return FAIL; |
||||||
|
- else if (**arg != '(') |
||||||
|
+ |
||||||
|
+ if (**arg != '(') |
||||||
|
{ |
||||||
|
if (verbose) |
||||||
|
{ |
||||||
|
diff -up vim82/src/testdir/test_lambda.vim.cve1420 vim82/src/testdir/test_lambda.vim |
||||||
|
--- vim82/src/testdir/test_lambda.vim.cve1420 2022-04-25 16:01:03.560985007 +0200 |
||||||
|
+++ vim82/src/testdir/test_lambda.vim 2022-04-25 16:17:01.694886566 +0200 |
||||||
|
@@ -64,6 +64,10 @@ function Test_lambda_fails() |
||||||
|
call assert_fails('echo {a, a -> a + a}(1, 2)', 'E853:') |
||||||
|
call assert_fails('echo {a, b -> a + b)}(1, 2)', 'E451:') |
||||||
|
echo assert_fails('echo 10->{a -> a + 2}', 'E107:') |
||||||
|
+ call assert_fails('eval 0->(3)()', "E1275:") |
||||||
|
+ call assert_fails('eval 0->([3])()', "E1275:") |
||||||
|
+ call assert_fails('eval 0->({"a": 3})()', "E1275:") |
||||||
|
+ call assert_fails('eval 0->(xxx)()', "E121:") |
||||||
|
endfunc |
||||||
|
|
||||||
|
func Test_not_lamda() |
@ -0,0 +1,50 @@ |
|||||||
|
diff -up vim82/src/errors.h.cve1621 vim82/src/errors.h |
||||||
|
--- vim82/src/errors.h.cve1621 2022-05-24 13:36:23.883370040 +0200 |
||||||
|
+++ vim82/src/errors.h 2022-05-24 13:36:47.665487703 +0200 |
||||||
|
@@ -387,3 +387,7 @@ EXTERN char e_resulting_text_too_long[] |
||||||
|
EXTERN char e_string_or_function_required_for_arrow_parens_expr[] |
||||||
|
INIT(= N_("E1275: String or function required for ->(expr)")); |
||||||
|
#endif |
||||||
|
+#ifdef FEAT_SPELL |
||||||
|
+EXTERN char e_illegal_character_in_word[] |
||||||
|
+ INIT(= N_("E1280: Illegal character in word")); |
||||||
|
+#endif |
||||||
|
diff -up vim82/src/mbyte.c.cve1621 vim82/src/mbyte.c |
||||||
|
--- vim82/src/mbyte.c.cve1621 2021-03-22 10:02:42.000000000 +0100 |
||||||
|
+++ vim82/src/mbyte.c 2022-05-24 13:36:23.884370045 +0200 |
||||||
|
@@ -4181,7 +4181,7 @@ theend: |
||||||
|
convert_setup(&vimconv, NULL, NULL); |
||||||
|
} |
||||||
|
|
||||||
|
-#if defined(FEAT_GUI_GTK) || defined(PROTO) |
||||||
|
+#if defined(FEAT_GUI_GTK) || defined(FEAT_SPELL) || defined(PROTO) |
||||||
|
/* |
||||||
|
* Return TRUE if string "s" is a valid utf-8 string. |
||||||
|
* When "end" is NULL stop at the first NUL. |
||||||
|
diff -up vim82/src/spellfile.c.cve1621 vim82/src/spellfile.c |
||||||
|
--- vim82/src/spellfile.c.cve1621 2021-03-22 10:02:42.000000000 +0100 |
||||||
|
+++ vim82/src/spellfile.c 2022-05-24 13:36:23.885370049 +0200 |
||||||
|
@@ -4391,6 +4391,10 @@ store_word( |
||||||
|
int res = OK; |
||||||
|
char_u *p; |
||||||
|
|
||||||
|
+ // Avoid adding illegal bytes to the word tree. |
||||||
|
+ if (enc_utf8 && !utf_valid_string(word, NULL)) |
||||||
|
+ return FAIL; |
||||||
|
+ |
||||||
|
(void)spell_casefold(word, len, foldword, MAXWLEN); |
||||||
|
for (p = pfxlist; res == OK; ++p) |
||||||
|
{ |
||||||
|
@@ -6191,6 +6195,12 @@ spell_add_word( |
||||||
|
int i; |
||||||
|
char_u *spf; |
||||||
|
|
||||||
|
+ if (enc_utf8 && !utf_valid_string(word, NULL)) |
||||||
|
+ { |
||||||
|
+ emsg(_(e_illegal_character_in_word)); |
||||||
|
+ return; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
if (idx == 0) // use internal wordlist |
||||||
|
{ |
||||||
|
if (int_wordlist == NULL) |
@ -0,0 +1,33 @@ |
|||||||
|
From 53a70289c2712808e6d4e88927e03cac01b470dd Mon Sep 17 00:00:00 2001 |
||||||
|
From: Bram Moolenaar <Bram@vim.org> |
||||||
|
Date: Mon, 9 May 2022 13:15:07 +0100 |
||||||
|
Subject: [PATCH] patch 8.2.4925: trailing backslash may cause reading past end |
||||||
|
of line |
||||||
|
|
||||||
|
Problem: Trailing backslash may cause reading past end of line. |
||||||
|
Solution: Check for NUL after backslash. |
||||||
|
--- |
||||||
|
src/testdir/test_textobjects.vim | 10 +++++++++- |
||||||
|
src/textobject.c | 4 ++++ |
||||||
|
src/version.c | 2 ++ |
||||||
|
3 files changed, 15 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/src/textobject.c b/src/textobject.c |
||||||
|
index e4a7db38e..edaa64c51 100644 |
||||||
|
--- a/src/textobject.c |
||||||
|
+++ b/src/textobject.c |
||||||
|
@@ -1664,7 +1664,11 @@ find_next_quote( |
||||||
|
if (c == NUL) |
||||||
|
return -1; |
||||||
|
else if (escape != NULL && vim_strchr(escape, c)) |
||||||
|
+ { |
||||||
|
++col; |
||||||
|
+ if (line[col] == NUL) |
||||||
|
+ return -1; |
||||||
|
+ } |
||||||
|
else if (c == quotechar) |
||||||
|
break; |
||||||
|
if (has_mbyte) |
||||||
|
-- |
||||||
|
2.36.1 |
||||||
|
|
@ -0,0 +1,59 @@ |
|||||||
|
diff -up vim82/src/ex_cmds.c.cve1785 vim82/src/ex_cmds.c |
||||||
|
--- vim82/src/ex_cmds.c.cve1785 2022-06-10 10:26:16.883312704 +0200 |
||||||
|
+++ vim82/src/ex_cmds.c 2022-06-10 10:26:16.910312568 +0200 |
||||||
|
@@ -4356,12 +4356,17 @@ ex_substitute(exarg_T *eap) |
||||||
|
// Save flags for recursion. They can change for e.g. |
||||||
|
// :s/^/\=execute("s#^##gn") |
||||||
|
subflags_save = subflags; |
||||||
|
+ |
||||||
|
+ // Disallow changing text or switching window in an expression. |
||||||
|
+ ++textwinlock; |
||||||
|
#endif |
||||||
|
// get length of substitution part |
||||||
|
sublen = vim_regsub_multi(®match, |
||||||
|
sub_firstlnum - regmatch.startpos[0].lnum, |
||||||
|
sub, sub_firstline, FALSE, magic_isset(), TRUE); |
||||||
|
#ifdef FEAT_EVAL |
||||||
|
+ --textwinlock; |
||||||
|
+ |
||||||
|
// If getting the substitute string caused an error, don't do |
||||||
|
// the replacement. |
||||||
|
// Don't keep flags set by a recursive call. |
||||||
|
@@ -4462,9 +4467,15 @@ ex_substitute(exarg_T *eap) |
||||||
|
mch_memmove(new_end, sub_firstline + copycol, (size_t)copy_len); |
||||||
|
new_end += copy_len; |
||||||
|
|
||||||
|
+#ifdef FEAT_EVAL |
||||||
|
+ ++textwinlock; |
||||||
|
+#endif |
||||||
|
(void)vim_regsub_multi(®match, |
||||||
|
sub_firstlnum - regmatch.startpos[0].lnum, |
||||||
|
sub, new_end, TRUE, magic_isset(), TRUE); |
||||||
|
+#ifdef FEAT_EVAL |
||||||
|
+ --textwinlock; |
||||||
|
+#endif |
||||||
|
sub_nsubs++; |
||||||
|
did_sub = TRUE; |
||||||
|
|
||||||
|
diff -up vim82/src/testdir/test_substitute.vim.cve1785 vim82/src/testdir/test_substitute.vim |
||||||
|
--- vim82/src/testdir/test_substitute.vim.cve1785 2022-06-10 10:26:16.910312568 +0200 |
||||||
|
+++ vim82/src/testdir/test_substitute.vim 2022-06-10 10:27:02.166084629 +0200 |
||||||
|
@@ -942,5 +942,18 @@ func Test_using_old_sub() |
||||||
|
set nocompatible |
||||||
|
endfunc |
||||||
|
|
||||||
|
+" This was switching windows in between computing the length and using it. |
||||||
|
+func Test_sub_change_window() |
||||||
|
+ silent! lfile |
||||||
|
+ sil! norm o0000000000000000000000000000000000000000000000000000 |
||||||
|
+ func Repl() |
||||||
|
+ lopen |
||||||
|
+ endfunc |
||||||
|
+ silent! s/\%')/\=Repl() |
||||||
|
+ bwipe! |
||||||
|
+ bwipe! |
||||||
|
+ delfunc Repl |
||||||
|
+endfunc |
||||||
|
+ |
||||||
|
|
||||||
|
" vim: shiftwidth=2 sts=2 expandtab |
@ -0,0 +1,121 @@ |
|||||||
|
diff -up vim82/src/normal.c.cve1897 vim82/src/normal.c |
||||||
|
--- vim82/src/normal.c.cve1897 2022-06-13 09:31:42.880768567 +0200 |
||||||
|
+++ vim82/src/normal.c 2022-06-13 09:35:38.560084927 +0200 |
||||||
|
@@ -479,6 +479,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 |
||||||
|
@@ -742,14 +758,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; |
||||||
|
|
||||||
|
/* |
||||||
|
@@ -4212,12 +4223,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); |
||||||
|
@@ -6343,14 +6350,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 vim82/src/testdir/test_substitute.vim.cve1897 vim82/src/testdir/test_substitute.vim |
||||||
|
--- vim82/src/testdir/test_substitute.vim.cve1897 2022-06-13 09:31:42.938768884 +0200 |
||||||
|
+++ vim82/src/testdir/test_substitute.vim 2022-06-13 09:36:39.013406036 +0200 |
||||||
|
@@ -955,5 +955,27 @@ func Test_sub_change_window() |
||||||
|
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 |
||||||
|
+ |
||||||
|
|
||||||
|
" vim: shiftwidth=2 sts=2 expandtab |
||||||
|
diff -up vim82/src/undo.c.cve1897 vim82/src/undo.c |
||||||
|
--- vim82/src/undo.c.cve1897 2022-06-13 09:31:42.904768698 +0200 |
||||||
|
+++ vim82/src/undo.c 2022-06-13 09:31:42.938768884 +0200 |
||||||
|
@@ -2323,6 +2323,12 @@ undo_time( |
||||||
|
int above = FALSE; |
||||||
|
int did_undo = TRUE; |
||||||
|
|
||||||
|
+ if (text_locked()) |
||||||
|
+ { |
||||||
|
+ text_locked_msg(); |
||||||
|
+ return; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
// First make sure the current undoable change is synced. |
||||||
|
if (curbuf->b_u_synced == FALSE) |
||||||
|
u_sync(TRUE); |
@ -0,0 +1,106 @@ |
|||||||
|
diff -up vim82/src/ex_docmd.c.cve1927 vim82/src/ex_docmd.c |
||||||
|
--- vim82/src/ex_docmd.c.cve1927 2021-03-22 10:02:42.000000000 +0100 |
||||||
|
+++ vim82/src/ex_docmd.c 2022-06-13 15:29:45.099472751 +0200 |
||||||
|
@@ -3081,6 +3081,8 @@ parse_cmd_address(exarg_T *eap, char **e |
||||||
|
{ |
||||||
|
int address_count = 1; |
||||||
|
linenr_T lnum; |
||||||
|
+ int need_check_cursor = FALSE; |
||||||
|
+ int ret = FAIL; |
||||||
|
|
||||||
|
// Repeat for all ',' or ';' separated addresses. |
||||||
|
for (;;) |
||||||
|
@@ -3091,7 +3093,7 @@ parse_cmd_address(exarg_T *eap, char **e |
||||||
|
lnum = get_address(eap, &eap->cmd, eap->addr_type, eap->skip, silent, |
||||||
|
eap->addr_count == 0, address_count++); |
||||||
|
if (eap->cmd == NULL) // error detected |
||||||
|
- return FAIL; |
||||||
|
+ goto theend; |
||||||
|
if (lnum == MAXLNUM) |
||||||
|
{ |
||||||
|
if (*eap->cmd == '%') // '%' - all lines |
||||||
|
@@ -3136,14 +3138,14 @@ parse_cmd_address(exarg_T *eap, char **e |
||||||
|
// there is no Vim command which uses '%' and |
||||||
|
// ADDR_WINDOWS or ADDR_TABS |
||||||
|
*errormsg = _(e_invrange); |
||||||
|
- return FAIL; |
||||||
|
+ goto theend; |
||||||
|
} |
||||||
|
break; |
||||||
|
case ADDR_TABS_RELATIVE: |
||||||
|
case ADDR_UNSIGNED: |
||||||
|
case ADDR_QUICKFIX: |
||||||
|
*errormsg = _(e_invrange); |
||||||
|
- return FAIL; |
||||||
|
+ goto theend; |
||||||
|
case ADDR_ARGUMENTS: |
||||||
|
if (ARGCOUNT == 0) |
||||||
|
eap->line1 = eap->line2 = 0; |
||||||
|
@@ -3175,7 +3177,7 @@ parse_cmd_address(exarg_T *eap, char **e |
||||||
|
if (eap->addr_type != ADDR_LINES) |
||||||
|
{ |
||||||
|
*errormsg = _(e_invrange); |
||||||
|
- return FAIL; |
||||||
|
+ goto theend; |
||||||
|
} |
||||||
|
|
||||||
|
++eap->cmd; |
||||||
|
@@ -3183,11 +3185,11 @@ parse_cmd_address(exarg_T *eap, char **e |
||||||
|
{ |
||||||
|
fp = getmark('<', FALSE); |
||||||
|
if (check_mark(fp) == FAIL) |
||||||
|
- return FAIL; |
||||||
|
+ goto theend; |
||||||
|
eap->line1 = fp->lnum; |
||||||
|
fp = getmark('>', FALSE); |
||||||
|
if (check_mark(fp) == FAIL) |
||||||
|
- return FAIL; |
||||||
|
+ goto theend; |
||||||
|
eap->line2 = fp->lnum; |
||||||
|
++eap->addr_count; |
||||||
|
} |
||||||
|
@@ -3202,10 +3204,13 @@ parse_cmd_address(exarg_T *eap, char **e |
||||||
|
if (!eap->skip) |
||||||
|
{ |
||||||
|
curwin->w_cursor.lnum = eap->line2; |
||||||
|
+ |
||||||
|
// Don't leave the cursor on an illegal line or column, but do |
||||||
|
// accept zero as address, so 0;/PATTERN/ works correctly. |
||||||
|
+ // Check the cursor position before returning. |
||||||
|
if (eap->line2 > 0) |
||||||
|
check_cursor(); |
||||||
|
+ need_check_cursor = TRUE; |
||||||
|
} |
||||||
|
} |
||||||
|
else if (*eap->cmd != ',') |
||||||
|
@@ -3221,7 +3226,12 @@ parse_cmd_address(exarg_T *eap, char **e |
||||||
|
if (lnum == MAXLNUM) |
||||||
|
eap->addr_count = 0; |
||||||
|
} |
||||||
|
- return OK; |
||||||
|
+ ret = OK; |
||||||
|
+ |
||||||
|
+theend: |
||||||
|
+ if (need_check_cursor) |
||||||
|
+ check_cursor(); |
||||||
|
+ return ret; |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
diff -up vim82/src/testdir/test_excmd.vim.cve1927 vim82/src/testdir/test_excmd.vim |
||||||
|
--- vim82/src/testdir/test_excmd.vim.cve1927 2022-06-13 15:26:53.941517542 +0200 |
||||||
|
+++ vim82/src/testdir/test_excmd.vim 2022-06-13 15:30:53.972860361 +0200 |
||||||
|
@@ -536,4 +536,13 @@ func Test_sandbox() |
||||||
|
sandbox call Sandbox_tests() |
||||||
|
endfunc |
||||||
|
|
||||||
|
+" This was leaving the cursor in line zero |
||||||
|
+func Test_using_zero_in_range() |
||||||
|
+ new |
||||||
|
+ norm o00 |
||||||
|
+ silent! 0;s/\%') |
||||||
|
+ bwipe! |
||||||
|
+endfunc |
||||||
|
+ |
||||||
|
+ |
||||||
|
" vim: shiftwidth=2 sts=2 expandtab |
@ -1,26 +1,26 @@ |
|||||||
diff -up vim82/src/term.c.fixkeys vim82/src/term.c |
diff -up vim82/src/term.c.fixkeys vim82/src/term.c |
||||||
--- vim82/src/term.c.fixkeys 2022-02-07 09:23:09.195365881 +0100 |
--- vim82/src/term.c.fixkeys 2021-01-08 10:12:59.191309539 +0100 |
||||||
+++ vim82/src/term.c 2022-02-07 09:31:31.279695977 +0100 |
+++ vim82/src/term.c 2021-01-08 10:18:05.410470981 +0100 |
||||||
@@ -921,14 +921,14 @@ static struct builtin_term builtin_termc |
@@ -919,14 +919,14 @@ static struct builtin_term builtin_termc |
||||||
{K_XRIGHT, "\033[@;*C"}, |
{K_XRIGHT, IF_EB("\033[@;*C", ESC_STR "[@;*C")}, |
||||||
{K_XLEFT, "\033[@;*D"}, |
{K_XLEFT, IF_EB("\033[@;*D", ESC_STR "[@;*D")}, |
||||||
// An extra set of function keys for vt100 mode |
// An extra set of function keys for vt100 mode |
||||||
- {K_XF1, "\033O*P"}, |
- {K_XF1, IF_EB("\033O*P", ESC_STR "O*P")}, |
||||||
- {K_XF2, "\033O*Q"}, |
- {K_XF2, IF_EB("\033O*Q", ESC_STR "O*Q")}, |
||||||
- {K_XF3, "\033O*R"}, |
- {K_XF3, IF_EB("\033O*R", ESC_STR "O*R")}, |
||||||
- {K_XF4, "\033O*S"}, |
- {K_XF4, IF_EB("\033O*S", ESC_STR "O*S")}, |
||||||
- {K_F1, "\033[11;*~"}, |
- {K_F1, IF_EB("\033[11;*~", ESC_STR "[11;*~")}, |
||||||
- {K_F2, "\033[12;*~"}, |
- {K_F2, IF_EB("\033[12;*~", ESC_STR "[12;*~")}, |
||||||
- {K_F3, "\033[13;*~"}, |
- {K_F3, IF_EB("\033[13;*~", ESC_STR "[13;*~")}, |
||||||
- {K_F4, "\033[14;*~"}, |
- {K_F4, IF_EB("\033[14;*~", ESC_STR "[14;*~")}, |
||||||
+ {K_XF1, "\033[11~"}, |
+ {K_XF1, IF_EB("\033[11~", ESC_STR "[11~")}, |
||||||
+ {K_XF2, "\033[12~"}, |
+ {K_XF2, IF_EB("\033[12~", ESC_STR "[12~")}, |
||||||
+ {K_XF3, "\033[13~"}, |
+ {K_XF3, IF_EB("\033[13~", ESC_STR "[13~")}, |
||||||
+ {K_XF4, "\033[14~"}, |
+ {K_XF4, IF_EB("\033[14~", ESC_STR "[14~")}, |
||||||
+ {K_F1, "\033OP"}, |
+ {K_F1, IF_EB("\033OP", ESC_STR "OP")}, |
||||||
+ {K_F2, "\033OQ"}, |
+ {K_F2, IF_EB("\033OQ", ESC_STR "OQ")}, |
||||||
+ {K_F3, "\033OR"}, |
+ {K_F3, IF_EB("\033OR", ESC_STR "OR")}, |
||||||
+ {K_F4, "\033OS"}, |
+ {K_F4, IF_EB("\033OS", ESC_STR "OS")}, |
||||||
{K_F5, "\033[15;*~"}, |
{K_F5, IF_EB("\033[15;*~", ESC_STR "[15;*~")}, |
||||||
{K_F6, "\033[17;*~"}, |
{K_F6, IF_EB("\033[17;*~", ESC_STR "[17;*~")}, |
||||||
{K_F7, "\033[18;*~"}, |
{K_F7, IF_EB("\033[18;*~", ESC_STR "[18;*~")}, |
||||||
|
Binary file not shown.
Loading…
Reference in new issue