]> git.pld-linux.org Git - packages/vim.git/blame - 7.2.132
- new
[packages/vim.git] / 7.2.132
CommitLineData
478508cd
ER
1To: vim-dev@vim.org
2Subject: Patch 7.2.132
3Fcc: outbox
4From: Bram Moolenaar <Bram@moolenaar.net>
5Mime-Version: 1.0
6Content-Type: text/plain; charset=ISO-8859-1
7Content-Transfer-Encoding: 8bit
8------------
9
10Patch 7.2.132
11Problem: When changing directory during a SwapExists autocmd freed memory
12 may be accessed. (Dominique Pelle)
13Solution: Add the allbuf_lock flag.
14Files: 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--
262hundred-and-one symptoms of being an internet addict:
263168. 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 ///
This page took 0.086215 seconds and 4 git commands to generate.