]>
Commit | Line | Data |
---|---|---|
478508cd ER |
1 | To: vim-dev@vim.org |
2 | Subject: Patch 7.2.132 | |
3 | Fcc: outbox | |
4 | From: Bram Moolenaar <Bram@moolenaar.net> | |
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 -- 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 /// |