]>
Commit | Line | Data |
---|---|---|
c936e692 AG |
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 /// |