]> git.pld-linux.org Git - packages/vim.git/blame - 7.2.280
- new
[packages/vim.git] / 7.2.280
CommitLineData
c936e692
AG
1To: vim-dev@vim.org
2Subject: Patch 7.2.280
3Fcc: outbox
4From: Bram Moolenaar <Bram@moolenaar.net>
5Mime-Version: 1.0
6Content-Type: text/plain; charset=UTF-8
7Content-Transfer-Encoding: 8bit
8------------
9
10Patch 7.2.280
11Problem: A redraw in a custom statusline with %! may cause a crash.
12 (Yukihiro Nakadaira)
13Solution: Make a copy of 'statusline'. Also fix typo in function name
14 redraw_custum_statusline. (party by Dominique Pelle)
15Files: 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--
246Every 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.057119 seconds and 4 git commands to generate.