]> granicus.if.org Git - vim/commitdiff
patch 8.2.4688: new regexp engine does not give an error for "\%v" v8.2.4688
authorBram Moolenaar <Bram@vim.org>
Mon, 4 Apr 2022 17:32:32 +0000 (18:32 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 4 Apr 2022 17:32:32 +0000 (18:32 +0100)
Problem:    New regexp engine does not give an error for "\%v".
Solution:   Check for a value argument. (issue #10079)

src/errors.h
src/regexp_bt.c
src/regexp_nfa.c
src/testdir/test_regexp_latin.vim
src/version.c

index 951acabb2926df5f45ccf4b3f69e6d9fc8f94785..82c585e7e6f1983ea2708e1422174bff82277526 100644 (file)
@@ -3082,7 +3082,7 @@ EXTERN char e_no_white_space_allowed_after_str_str[]
 EXTERN char e_dot_can_only_be_used_on_dictionary_str[]
        INIT(= N_("E1203: Dot can only be used on a dictionary: %s"));
 #endif
-EXTERN char e_regexp_number_after_dot_pos_search[]
+EXTERN char e_regexp_number_after_dot_pos_search_chr[]
        INIT(= N_("E1204: No Number allowed after .: '\\%%%c'"));
 EXTERN char e_no_white_space_allowed_between_option_and[]
        INIT(= N_("E1205: No white space allowed between option and"));
@@ -3256,3 +3256,5 @@ EXTERN char e_compiling_closure_without_context_str[]
 EXTERN char e_using_type_not_in_script_context_str[]
        INIT(= N_("E1272: Using type not in a script context: %s"));
 #endif
+EXTERN char e_nfa_regexp_missing_value_in_chr[]
+       INIT(= N_("E1273: (NFA regexp) missing value in '\\%%%c'"));
index 793faaf6bc0fd9fcdb7e6cc57555e481bb610570..0b3487fa0ac50c2391099e474604149a97e8f04b 100644 (file)
@@ -1649,7 +1649,8 @@ regatom(int *flagp)
                              {
                                  if (cur && n)
                                  {
-                                   semsg(_(e_regexp_number_after_dot_pos_search), no_Magic(c));
+                                   semsg(_(e_regexp_number_after_dot_pos_search_chr),
+                                                                 no_Magic(c));
                                    rc_did_emsg = TRUE;
                                    return NULL;
                                  }
index 503895eede5d0c99999527f36aff8f8133a6a3cd..d658a6bd78599cb07aa24b639c9ced5bd02ccc96 100644 (file)
@@ -1654,7 +1654,7 @@ nfa_regatom(void)
 
                            if (cur)
                            {
-                               semsg(_(e_regexp_number_after_dot_pos_search),
+                               semsg(_(e_regexp_number_after_dot_pos_search_chr),
                                                                  no_Magic(c));
                                return FAIL;
                            }
@@ -1673,6 +1673,12 @@ nfa_regatom(void)
                        {
                            long_u limit = INT_MAX;
 
+                           if (!cur && n == 0)
+                           {
+                               semsg(_(e_nfa_regexp_missing_value_in_chr),
+                                                                 no_Magic(c));
+                               return FAIL;
+                           }
                            if (c == 'l')
                            {
                                if (cur)
index fc9c81bfeea7a7ffa0e4f3043add0aaa0c872933..dfb367b5f1d8fad5f797220e0c203dfc5c7112fd 100644 (file)
@@ -91,6 +91,18 @@ func Test_multi_failure()
   set re=0
 endfunc
 
+func Test_column_failure()
+  set re=1
+  call assert_fails('/\%v', 'E71:')
+  call assert_fails('/\%c', 'E71:')
+  call assert_fails('/\%l', 'E71:')
+  set re=2
+  call assert_fails('/\%v', 'E1273:')
+  call assert_fails('/\%c', 'E1273:')
+  call assert_fails('/\%l', 'E1273:')
+  set re=0
+endfunc
+
 func Test_recursive_addstate()
   " This will call addstate() recursively until it runs into the limit.
   let lnum = search('\v((){328}){389}')
index 23dede051a9b192a5fd6e4b59c30be1c3fb54ab7..9b1d56a04e3ba00654ffb83e2f837ffe3342bdde 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4688,
 /**/
     4687,
 /**/