|
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 /// |