Patch 8.2.4959
Problem:    Using NULL regexp program.
Solution:   Check for regexp program becoming NULL in more places.
Files:      src/buffer.c, src/testdir/test_buffer.vim


*** ../vim-8.2.4958/src/buffer.c        2022-05-11 11:42:24.048585612 +0100
--- src/buffer.c        2022-05-15 14:48:02.490143778 +0100
***************
*** 2642,2654 ****
                if (*p == '^' && !(attempt & 1))         // add/remove '^'
                    ++p;
                regmatch.regprog = vim_regcomp(p, magic_isset() ? RE_MAGIC : 0);
-               if (regmatch.regprog == NULL)
-               {
-                   vim_free(pat);
-                   return -1;
-               }
  
                FOR_ALL_BUFS_FROM_LAST(buf)
                    if (buf->b_p_bl == find_listed
  #ifdef FEAT_DIFF
                            && (!diffmode || diff_mode_buf(buf))
--- 2642,2656 ----
                if (*p == '^' && !(attempt & 1))         // add/remove '^'
                    ++p;
                regmatch.regprog = vim_regcomp(p, magic_isset() ? RE_MAGIC : 0);
  
                FOR_ALL_BUFS_FROM_LAST(buf)
+               {
+                   if (regmatch.regprog == NULL)
+                   {
+                       // invalid pattern, possibly after switching engine
+                       vim_free(pat);
+                       return -1;
+                   }
                    if (buf->b_p_bl == find_listed
  #ifdef FEAT_DIFF
                            && (!diffmode || diff_mode_buf(buf))
***************
*** 2674,2679 ****
--- 2676,2682 ----
                        }
                        match = buf->b_fnum;    // remember first match
                    }
+               }
  
                vim_regfree(regmatch.regprog);
                if (match >= 0)                 // found one match
***************
*** 2766,2777 ****
            if (attempt > 0 && patc == pat)
                break;  // there was no anchor, no need to try again
            regmatch.regprog = vim_regcomp(patc + attempt * 11, RE_MAGIC);
-           if (regmatch.regprog == NULL)
-           {
-               if (patc != pat)
-                   vim_free(patc);
-               return FAIL;
-           }
        }
  
        // round == 1: Count the matches.
--- 2769,2774 ----
***************
*** 2792,2798 ****
--- 2789,2804 ----
  #endif
  
                if (!fuzzy)
+               {
+                   if (regmatch.regprog == NULL)
+                   {
+                       // invalid pattern, possibly after recompiling
+                       if (patc != pat)
+                           vim_free(patc);
+                       return FAIL;
+                   }
                    p = buflist_match(&regmatch, buf, p_wic);
+               }
                else
                {
                    p = NULL;
***************
*** 2921,2926 ****
--- 2927,2933 ----
  
  /*
   * Check for a match on the file name for buffer "buf" with regprog "prog".
+  * Note that rmp->regprog may become NULL when switching regexp engine.
   */
      static char_u *
  buflist_match(
***************
*** 2939,2945 ****
  }
  
  /*
!  * Try matching the regexp in "prog" with file name "name".
   * Return "name" when there is a match, NULL when not.
   */
      static char_u *
--- 2946,2953 ----
  }
  
  /*
!  * Try matching the regexp in "rmp->regprog" with file name "name".
!  * Note that rmp->regprog may become NULL when switching regexp engine.
   * Return "name" when there is a match, NULL when not.
   */
      static char_u *
***************
*** 2951,2957 ****
      char_u    *match = NULL;
      char_u    *p;
  
!     if (name != NULL)
      {
        // Ignore case when 'fileignorecase' or the argument is set.
        rmp->rm_ic = p_fic || ignore_case;
--- 2959,2966 ----
      char_u    *match = NULL;
      char_u    *p;
  
!     // extra check for valid arguments
!     if (name != NULL && rmp->regprog != NULL)
      {
        // Ignore case when 'fileignorecase' or the argument is set.
        rmp->rm_ic = p_fic || ignore_case;
*** ../vim-8.2.4958/src/testdir/test_buffer.vim 2022-05-11 11:42:24.052585610 
+0100
--- src/testdir/test_buffer.vim 2022-05-15 14:45:19.350273994 +0100
***************
*** 419,424 ****
--- 419,430 ----
    vsplit 00000000000000000000000000
    silent! buf [0--]\&\zs*\zs*e
    bwipe!
+ 
+   " similar case with different code path
+   split 0
+   edit ΓΏ
+   silent! buf [0--]\&\zs*\zs*0
+   bwipe!
  endfunc
  
  " Test for the 'maxmem' and 'maxmemtot' options
*** ../vim-8.2.4958/src/version.c       2022-05-15 13:59:08.704167482 +0100
--- src/version.c       2022-05-15 14:49:14.386086360 +0100
***************
*** 748,749 ****
--- 748,751 ----
  {   /* Add new patch number below this line */
+ /**/
+     4959,
  /**/

-- 
$ echo pizza > /dev/oven

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20220515135044.D244C1C076B%40moolenaar.net.

Raspunde prin e-mail lui