components/vim/vim72-patches/7.2.132
changeset 198 172fc01ce997
equal deleted inserted replaced
197:fd801ec0737c 198:172fc01ce997
       
     1 To: [email protected]
       
     2 Subject: Patch 7.2.132
       
     3 Fcc: outbox
       
     4 From: Bram Moolenaar <[email protected]>
       
     5 Mime-Version: 1.0
       
     6 Content-Type: text/plain; charset=ISO-8859-1
       
     7 Content-Transfer-Encoding: 8bit
       
     8 ------------
       
     9 
       
    10 Patch 7.2.132
       
    11 Problem:    When changing directory during a SwapExists autocmd freed memory
       
    12             may be accessed. (Dominique Pelle)
       
    13 Solution:   Add the allbuf_lock flag.
       
    14 Files:      src/ex_getln.c, src/globals.h, src/fileio.c,
       
    15             src/proto/ex_getln.pro
       
    16     
       
    17 
       
    18 *** ../vim-7.2.131/src/ex_getln.c	Mon Mar  2 02:11:09 2009
       
    19 --- src/ex_getln.c	Mon Mar  2 00:53:39 2009
       
    20 ***************
       
    21 *** 2000,2007 ****
       
    22   
       
    23   #if defined(FEAT_AUTOCMD) || defined(PROTO)
       
    24   /*
       
    25 !  * Check if "curbuf_lock" is set and return TRUE when it is and give an error
       
    26 !  * message.
       
    27    */
       
    28       int
       
    29   curbuf_locked()
       
    30 --- 2000,2007 ----
       
    31   
       
    32   #if defined(FEAT_AUTOCMD) || defined(PROTO)
       
    33   /*
       
    34 !  * Check if "curbuf_lock" or "allbuf_lock" is set and return TRUE when it is
       
    35 !  * and give an error message.
       
    36    */
       
    37       int
       
    38   curbuf_locked()
       
    39 ***************
       
    40 *** 2011,2016 ****
       
    41 --- 2011,2031 ----
       
    42   	EMSG(_("E788: Not allowed to edit another buffer now"));
       
    43   	return TRUE;
       
    44       }
       
    45 +     return allbuf_locked();
       
    46 + }
       
    47 + 
       
    48 + /*
       
    49 +  * Check if "allbuf_lock" is set and return TRUE when it is and give an error
       
    50 +  * message.
       
    51 +  */
       
    52 +     int
       
    53 + allbuf_locked()
       
    54 + {
       
    55 +     if (allbuf_lock > 0)
       
    56 +     {
       
    57 + 	EMSG(_("E811: Not allowed to change buffer information now"));
       
    58 + 	return TRUE;
       
    59 +     }
       
    60       return FALSE;
       
    61   }
       
    62   #endif
       
    63 *** ../vim-7.2.131/src/globals.h	Mon Mar  2 02:44:54 2009
       
    64 --- src/globals.h	Mon Mar  2 02:40:16 2009
       
    65 ***************
       
    66 *** 619,624 ****
       
    67 --- 619,629 ----
       
    68   EXTERN int	curbuf_lock INIT(= 0);
       
    69   				/* non-zero when the current buffer can't be
       
    70   				 * changed.  Used for FileChangedRO. */
       
    71 + EXTERN int	allbuf_lock INIT(= 0);
       
    72 + 				/* non-zero when no buffer name can be
       
    73 + 				 * changed, no buffer can be deleted and
       
    74 + 				 * current directory can't be changed.
       
    75 + 				 * Used for SwapExists et al. */
       
    76   #endif
       
    77   #ifdef FEAT_EVAL
       
    78   # define HAVE_SANDBOX
       
    79 *** ../vim-7.2.131/src/fileio.c	Wed Dec 31 16:20:54 2008
       
    80 --- src/fileio.c	Sun Mar  1 23:37:10 2009
       
    81 ***************
       
    82 *** 69,75 ****
       
    83   static int au_find_group __ARGS((char_u *name));
       
    84   
       
    85   # define AUGROUP_DEFAULT    -1	    /* default autocmd group */
       
    86 ! # define AUGROUP_ERROR	    -2	    /* errornouse autocmd group */
       
    87   # define AUGROUP_ALL	    -3	    /* all autocmd groups */
       
    88   #endif
       
    89   
       
    90 --- 69,75 ----
       
    91   static int au_find_group __ARGS((char_u *name));
       
    92   
       
    93   # define AUGROUP_DEFAULT    -1	    /* default autocmd group */
       
    94 ! # define AUGROUP_ERROR	    -2	    /* erroneous autocmd group */
       
    95   # define AUGROUP_ALL	    -3	    /* all autocmd groups */
       
    96   #endif
       
    97   
       
    98 ***************
       
    99 *** 144,150 ****
       
   100   # endif
       
   101   #endif
       
   102   static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf));
       
   103 ! 
       
   104   
       
   105       void
       
   106   filemess(buf, name, s, attr)
       
   107 --- 144,152 ----
       
   108   # endif
       
   109   #endif
       
   110   static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf));
       
   111 ! #ifdef FEAT_AUTOCMD
       
   112 ! static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name");
       
   113 ! #endif
       
   114   
       
   115       void
       
   116   filemess(buf, name, s, attr)
       
   117 ***************
       
   118 *** 295,300 ****
       
   119 --- 297,315 ----
       
   120       int		conv_restlen = 0;	/* nr of bytes in conv_rest[] */
       
   121   #endif
       
   122   
       
   123 + #ifdef FEAT_AUTOCMD
       
   124 +     /* Remember the initial values of curbuf, curbuf->b_ffname and
       
   125 +      * curbuf->b_fname to detect whether they are altered as a result of
       
   126 +      * executing nasty autocommands.  Also check if "fname" and "sfname"
       
   127 +      * point to one of these values. */
       
   128 +     buf_T   *old_curbuf = curbuf;
       
   129 +     char_u  *old_b_ffname = curbuf->b_ffname;
       
   130 +     char_u  *old_b_fname = curbuf->b_fname;
       
   131 +     int     using_b_ffname = (fname == curbuf->b_ffname)
       
   132 + 					      || (sfname == curbuf->b_ffname);
       
   133 +     int     using_b_fname = (fname == curbuf->b_fname)
       
   134 + 					       || (sfname == curbuf->b_fname);
       
   135 + #endif
       
   136       write_no_eol_lnum = 0;	/* in case it was set by the previous read */
       
   137   
       
   138       /*
       
   139 ***************
       
   140 *** 589,595 ****
       
   141 --- 604,624 ----
       
   142   #ifdef FEAT_QUICKFIX
       
   143   		    if (!bt_dontwrite(curbuf))
       
   144   #endif
       
   145 + 		    {
       
   146   			check_need_swap(newfile);
       
   147 + #ifdef FEAT_AUTOCMD
       
   148 + 			/* SwapExists autocommand may mess things up */
       
   149 + 			if (curbuf != old_curbuf
       
   150 + 				|| (using_b_ffname
       
   151 + 					&& (old_b_ffname != curbuf->b_ffname))
       
   152 + 				|| (using_b_fname
       
   153 + 					 && (old_b_fname != curbuf->b_fname)))
       
   154 + 			{
       
   155 + 			    EMSG(_(e_auchangedbuf));
       
   156 + 			    return FAIL;
       
   157 + 			}
       
   158 + #endif
       
   159 + 		    }
       
   160   		    if (dir_of_file_exists(fname))
       
   161   			filemess(curbuf, sfname, (char_u *)_("[New File]"), 0);
       
   162   		    else
       
   163 ***************
       
   164 *** 668,673 ****
       
   165 --- 697,713 ----
       
   166   #endif
       
   167       {
       
   168   	check_need_swap(newfile);
       
   169 + #ifdef FEAT_AUTOCMD
       
   170 + 	if (!read_stdin && (curbuf != old_curbuf
       
   171 + 		|| (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
       
   172 + 		|| (using_b_fname && (old_b_fname != curbuf->b_fname))))
       
   173 + 	{
       
   174 + 	    EMSG(_(e_auchangedbuf));
       
   175 + 	    if (!read_buffer)
       
   176 + 		close(fd);
       
   177 + 	    return FAIL;
       
   178 + 	}
       
   179 + #endif
       
   180   #ifdef UNIX
       
   181   	/* Set swap file protection bits after creating it. */
       
   182   	if (swap_mode > 0 && curbuf->b_ml.ml_mfp->mf_fname != NULL)
       
   183 ***************
       
   184 *** 698,704 ****
       
   185       {
       
   186   	int	m = msg_scroll;
       
   187   	int	n = msg_scrolled;
       
   188 - 	buf_T	*old_curbuf = curbuf;
       
   189   
       
   190   	/*
       
   191   	 * The file must be closed again, the autocommands may want to change
       
   192 --- 738,743 ----
       
   193 ***************
       
   194 *** 740,747 ****
       
   195 --- 779,791 ----
       
   196   	/*
       
   197   	 * Don't allow the autocommands to change the current buffer.
       
   198   	 * Try to re-open the file.
       
   199 + 	 *
       
   200 + 	 * Don't allow the autocommands to change the buffer name either
       
   201 + 	 * (cd for example) if it invalidates fname or sfname.
       
   202   	 */
       
   203   	if (!read_stdin && (curbuf != old_curbuf
       
   204 + 		|| (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
       
   205 + 		|| (using_b_fname && (old_b_fname != curbuf->b_fname))
       
   206   		|| (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) < 0))
       
   207   	{
       
   208   	    --no_wait_return;
       
   209 ***************
       
   210 *** 6320,6326 ****
       
   211   
       
   212       if (!stuff_empty() || global_busy || !typebuf_typed()
       
   213   #ifdef FEAT_AUTOCMD
       
   214 ! 			|| autocmd_busy || curbuf_lock > 0
       
   215   #endif
       
   216   					)
       
   217   	need_check_timestamps = TRUE;		/* check later */
       
   218 --- 6364,6370 ----
       
   219   
       
   220       if (!stuff_empty() || global_busy || !typebuf_typed()
       
   221   #ifdef FEAT_AUTOCMD
       
   222 ! 			|| autocmd_busy || curbuf_lock > 0 || allbuf_lock > 0
       
   223   #endif
       
   224   					)
       
   225   	need_check_timestamps = TRUE;		/* check later */
       
   226 ***************
       
   227 *** 6522,6529 ****
       
   228 --- 6566,6575 ----
       
   229   	    set_vim_var_string(VV_FCS_REASON, (char_u *)reason, -1);
       
   230   	    set_vim_var_string(VV_FCS_CHOICE, (char_u *)"", -1);
       
   231   # endif
       
   232 + 	    ++allbuf_lock;
       
   233   	    n = apply_autocmds(EVENT_FILECHANGEDSHELL,
       
   234   				      buf->b_fname, buf->b_fname, FALSE, buf);
       
   235 + 	    --allbuf_lock;
       
   236   	    busy = FALSE;
       
   237   	    if (n)
       
   238   	    {
       
   239 *** ../vim-7.2.131/src/proto/ex_getln.pro	Fri Nov 28 10:59:57 2008
       
   240 --- src/proto/ex_getln.pro	Sun Mar  1 00:27:12 2009
       
   241 ***************
       
   242 *** 4,9 ****
       
   243 --- 4,10 ----
       
   244   int text_locked __ARGS((void));
       
   245   void text_locked_msg __ARGS((void));
       
   246   int curbuf_locked __ARGS((void));
       
   247 + int allbuf_locked __ARGS((void));
       
   248   char_u *getexline __ARGS((int c, void *dummy, int indent));
       
   249   char_u *getexmodeline __ARGS((int promptc, void *dummy, int indent));
       
   250   int cmdline_overstrike __ARGS((void));
       
   251 *** ../vim-7.2.131/src/version.c	Wed Mar  4 04:11:56 2009
       
   252 --- src/version.c	Thu Mar  5 03:08:54 2009
       
   253 ***************
       
   254 *** 678,679 ****
       
   255 --- 678,681 ----
       
   256   {   /* Add new patch number below this line */
       
   257 + /**/
       
   258 +     132,
       
   259   /**/
       
   260 
       
   261 -- 
       
   262 hundred-and-one symptoms of being an internet addict:
       
   263 168. You have your own domain name.
       
   264 
       
   265  /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
       
   266 ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
       
   267 \\\        download, build and distribute -- http://www.A-A-P.org        ///
       
   268  \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///