]> git.pld-linux.org Git - packages/vim.git/blob - 7.2.280
- new
[packages/vim.git] / 7.2.280
1 To: vim-dev@vim.org
2 Subject: Patch 7.2.280
3 Fcc: outbox
4 From: Bram Moolenaar <Bram@moolenaar.net>
5 Mime-Version: 1.0
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
8 ------------
9
10 Patch 7.2.280
11 Problem:    A redraw in a custom statusline with %! may cause a crash.
12             (Yukihiro Nakadaira)
13 Solution:   Make a copy of 'statusline'.  Also fix typo in function name
14             redraw_custum_statusline. (party by Dominique Pelle)
15 Files:      src/screen.c
16
17
18 *** ../vim-7.2.279/src/screen.c 2009-07-29 16:13:35.000000000 +0200
19 --- src/screen.c        2009-11-03 17:13:16.000000000 +0100
20 ***************
21 *** 132,138 ****
22   static void draw_vsep_win __ARGS((win_T *wp, int row));
23   #endif
24   #ifdef FEAT_STL_OPT
25 ! static void redraw_custum_statusline __ARGS((win_T *wp));
26   #endif
27   #ifdef FEAT_SEARCH_EXTRA
28   #define SEARCH_HL_PRIORITY 0
29 --- 132,138 ----
30   static void draw_vsep_win __ARGS((win_T *wp, int row));
31   #endif
32   #ifdef FEAT_STL_OPT
33 ! static void redraw_custom_statusline __ARGS((win_T *wp));
34   #endif
35   #ifdef FEAT_SEARCH_EXTRA
36   #define SEARCH_HL_PRIORITY 0
37 ***************
38 *** 5772,5778 ****
39       else if (*p_stl != NUL || *wp->w_p_stl != NUL)
40       {
41         /* redraw custom status line */
42 !       redraw_custum_statusline(wp);
43       }
44   #endif
45       else
46 --- 5794,5800 ----
47       else if (*p_stl != NUL || *wp->w_p_stl != NUL)
48       {
49         /* redraw custom status line */
50 !       redraw_custom_statusline(wp);
51       }
52   #endif
53       else
54 ***************
55 *** 5897,5914 ****
56    * errors encountered.
57    */
58       static void
59 ! redraw_custum_statusline(wp)
60       win_T         *wp;
61   {
62 !     int       save_called_emsg = called_emsg;
63   
64       called_emsg = FALSE;
65       win_redr_custom(wp, FALSE);
66       if (called_emsg)
67         set_string_option_direct((char_u *)"statusline", -1,
68                 (char_u *)"", OPT_FREE | (*wp->w_p_stl != NUL
69                                         ? OPT_LOCAL : OPT_GLOBAL), SID_ERROR);
70       called_emsg |= save_called_emsg;
71   }
72   #endif
73   
74 --- 5919,5949 ----
75    * errors encountered.
76    */
77       static void
78 ! redraw_custom_statusline(wp)
79       win_T         *wp;
80   {
81 !     static int            entered = FALSE;
82 !     int                   save_called_emsg = called_emsg;
83
84 !     /* When called recursively return.  This can happen when the statusline
85 !      * contains an expression that triggers a redraw. */
86 !     if (entered)
87 !       return;
88 !     entered = TRUE;
89   
90       called_emsg = FALSE;
91       win_redr_custom(wp, FALSE);
92       if (called_emsg)
93 +     {
94 +       /* When there is an error disable the statusline, otherwise the
95 +        * display is messed up with errors and a redraw triggers the problem
96 +        * again and again. */
97         set_string_option_direct((char_u *)"statusline", -1,
98                 (char_u *)"", OPT_FREE | (*wp->w_p_stl != NUL
99                                         ? OPT_LOCAL : OPT_GLOBAL), SID_ERROR);
100 +     }
101       called_emsg |= save_called_emsg;
102 +     entered = FALSE;
103   }
104   #endif
105   
106 ***************
107 *** 6016,6021 ****
108 --- 6051,6057 ----
109       int               len;
110       int               fillchar;
111       char_u    buf[MAXPATHL];
112 +     char_u    *stl;
113       char_u    *p;
114       struct    stl_hlrec hltab[STL_MAX_ITEM];
115       struct    stl_hlrec tabtab[STL_MAX_ITEM];
116 ***************
117 *** 6025,6031 ****
118       if (wp == NULL)
119       {
120         /* Use 'tabline'.  Always at the first line of the screen. */
121 !       p = p_tal;
122         row = 0;
123         fillchar = ' ';
124         attr = hl_attr(HLF_TPF);
125 --- 6061,6067 ----
126       if (wp == NULL)
127       {
128         /* Use 'tabline'.  Always at the first line of the screen. */
129 !       stl = p_tal;
130         row = 0;
131         fillchar = ' ';
132         attr = hl_attr(HLF_TPF);
133 ***************
134 *** 6042,6058 ****
135   
136         if (draw_ruler)
137         {
138 !           p = p_ruf;
139             /* advance past any leading group spec - implicit in ru_col */
140 !           if (*p == '%')
141             {
142 !               if (*++p == '-')
143 !                   p++;
144 !               if (atoi((char *) p))
145 !                   while (VIM_ISDIGIT(*p))
146 !                       p++;
147 !               if (*p++ != '(')
148 !                   p = p_ruf;
149             }
150   #ifdef FEAT_VERTSPLIT
151             col = ru_col - (Columns - W_WIDTH(wp));
152 --- 6078,6094 ----
153   
154         if (draw_ruler)
155         {
156 !           stl = p_ruf;
157             /* advance past any leading group spec - implicit in ru_col */
158 !           if (*stl == '%')
159             {
160 !               if (*++stl == '-')
161 !                   stl++;
162 !               if (atoi((char *)stl))
163 !                   while (VIM_ISDIGIT(*stl))
164 !                       stl++;
165 !               if (*stl++ != '(')
166 !                   stl = p_ruf;
167             }
168   #ifdef FEAT_VERTSPLIT
169             col = ru_col - (Columns - W_WIDTH(wp));
170 ***************
171 *** 6081,6089 ****
172         else
173         {
174             if (*wp->w_p_stl != NUL)
175 !               p = wp->w_p_stl;
176             else
177 !               p = p_stl;
178   # ifdef FEAT_EVAL
179             use_sandbox = was_set_insecurely((char_u *)"statusline",
180                                          *wp->w_p_stl == NUL ? 0 : OPT_LOCAL);
181 --- 6117,6125 ----
182         else
183         {
184             if (*wp->w_p_stl != NUL)
185 !               stl = wp->w_p_stl;
186             else
187 !               stl = p_stl;
188   # ifdef FEAT_EVAL
189             use_sandbox = was_set_insecurely((char_u *)"statusline",
190                                          *wp->w_p_stl == NUL ? 0 : OPT_LOCAL);
191 ***************
192 *** 6098,6107 ****
193       if (maxwidth <= 0)
194         return;
195   
196       width = build_stl_str_hl(wp == NULL ? curwin : wp,
197                                 buf, sizeof(buf),
198 !                               p, use_sandbox,
199                                 fillchar, maxwidth, hltab, tabtab);
200       len = (int)STRLEN(buf);
201   
202       while (width < maxwidth && len < (int)sizeof(buf) - 1)
203 --- 6134,6147 ----
204       if (maxwidth <= 0)
205         return;
206   
207 +     /* Make a copy, because the statusline may include a function call that
208 +      * might change the option value and free the memory. */
209 +     stl = vim_strsave(stl);
210       width = build_stl_str_hl(wp == NULL ? curwin : wp,
211                                 buf, sizeof(buf),
212 !                               stl, use_sandbox,
213                                 fillchar, maxwidth, hltab, tabtab);
214 +     vim_free(stl);
215       len = (int)STRLEN(buf);
216   
217       while (width < maxwidth && len < (int)sizeof(buf) - 1)
218 ***************
219 *** 9465,9471 ****
220   #if defined(FEAT_STL_OPT) && defined(FEAT_WINDOWS)
221       if ((*p_stl != NUL || *curwin->w_p_stl != NUL) && curwin->w_status_height)
222       {
223 !       redraw_custum_statusline(curwin);
224       }
225       else
226   #endif
227 --- 9505,9511 ----
228   #if defined(FEAT_STL_OPT) && defined(FEAT_WINDOWS)
229       if ((*p_stl != NUL || *curwin->w_p_stl != NUL) && curwin->w_status_height)
230       {
231 !       redraw_custom_statusline(curwin);
232       }
233       else
234   #endif
235 *** ../vim-7.2.279/src/version.c        2009-11-03 16:44:04.000000000 +0100
236 --- src/version.c       2009-11-03 17:15:35.000000000 +0100
237 ***************
238 *** 678,679 ****
239 --- 678,681 ----
240   {   /* Add new patch number below this line */
241 + /**/
242 +     280,
243   /**/
244
245 -- 
246 Every exit is an entrance into something else.
247
248  /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
249 ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
250 \\\        download, build and distribute -- http://www.A-A-P.org        ///
251  \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///
This page took 0.044393 seconds and 3 git commands to generate.