4 From: Bram Moolenaar <Bram@moolenaar.net>
6 Content-Type: text/plain; charset=ISO-8859-1
7 Content-Transfer-Encoding: 8bit
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
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
23 #if defined(FEAT_AUTOCMD) || defined(PROTO)
25 ! * Check if "curbuf_lock" is set and return TRUE when it is and give an error
32 #if defined(FEAT_AUTOCMD) || defined(PROTO)
34 ! * Check if "curbuf_lock" or "allbuf_lock" is set and return TRUE when it is
35 ! * and give an error message.
42 EMSG(_("E788: Not allowed to edit another buffer now"));
45 + return allbuf_locked();
49 + * Check if "allbuf_lock" is set and return TRUE when it is and give an error
55 + if (allbuf_lock > 0)
57 + EMSG(_("E811: Not allowed to change buffer information now"));
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
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. */
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
83 static int au_find_group __ARGS((char_u *name));
85 # define AUGROUP_DEFAULT -1 /* default autocmd group */
86 ! # define AUGROUP_ERROR -2 /* errornouse autocmd group */
87 # define AUGROUP_ALL -3 /* all autocmd groups */
91 static int au_find_group __ARGS((char_u *name));
93 # define AUGROUP_DEFAULT -1 /* default autocmd group */
94 ! # define AUGROUP_ERROR -2 /* erroneous autocmd group */
95 # define AUGROUP_ALL -3 /* all autocmd groups */
102 static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf));
106 filemess(buf, name, s, attr)
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");
116 filemess(buf, name, s, attr)
120 int conv_restlen = 0; /* nr of bytes in conv_rest[] */
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);
136 write_no_eol_lnum = 0; /* in case it was set by the previous read */
143 if (!bt_dontwrite(curbuf))
146 check_need_swap(newfile);
147 + #ifdef FEAT_AUTOCMD
148 + /* SwapExists autocommand may mess things up */
149 + if (curbuf != old_curbuf
151 + && (old_b_ffname != curbuf->b_ffname))
153 + && (old_b_fname != curbuf->b_fname)))
155 + EMSG(_(e_auchangedbuf));
160 if (dir_of_file_exists(fname))
161 filemess(curbuf, sfname, (char_u *)_("[New File]"), 0);
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))))
174 + EMSG(_(e_auchangedbuf));
181 /* Set swap file protection bits after creating it. */
182 if (swap_mode > 0 && curbuf->b_ml.ml_mfp->mf_fname != NULL)
187 int n = msg_scrolled;
188 - buf_T *old_curbuf = curbuf;
191 * The file must be closed again, the autocommands may want to change
197 * Don't allow the autocommands to change the current buffer.
198 * Try to re-open the file.
200 + * Don't allow the autocommands to change the buffer name either
201 + * (cd for example) if it invalidates fname or sfname.
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))
212 if (!stuff_empty() || global_busy || !typebuf_typed()
214 ! || autocmd_busy || curbuf_lock > 0
217 need_check_timestamps = TRUE; /* check later */
220 if (!stuff_empty() || global_busy || !typebuf_typed()
222 ! || autocmd_busy || curbuf_lock > 0 || allbuf_lock > 0
225 need_check_timestamps = TRUE; /* check later */
229 set_vim_var_string(VV_FCS_REASON, (char_u *)reason, -1);
230 set_vim_var_string(VV_FCS_CHOICE, (char_u *)"", -1);
233 n = apply_autocmds(EVENT_FILECHANGEDSHELL,
234 buf->b_fname, buf->b_fname, FALSE, buf);
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
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
256 { /* Add new patch number below this line */
262 hundred-and-one symptoms of being an internet addict:
263 168. You have your own domain name.
265 /// Bram Moolenaar -- Bram@Moolenaar.net -- 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 ///