]> git.pld-linux.org Git - packages/vim.git/blob - 7.2.132
- new
[packages/vim.git] / 7.2.132
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    ///
This page took 0.129906 seconds and 3 git commands to generate.