]>
Commit | Line | Data |
---|---|---|
9a1bc5e5 ER |
1 | To: vim_dev@googlegroups.com |
2 | Subject: Patch 7.3.155 | |
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.3.155 | |
11 | Problem: Crash when using map(), filter() and remove() on v:. (ZyX) | |
12 | Also for extend(). (Yukihiro Nakadaira) | |
13 | Solution: Mark v: as locked. Also correct locking error messages. | |
14 | Files: src/eval.c | |
15 | ||
16 | ||
17 | *** ../vim-7.3.154/src/eval.c 2011-04-01 16:07:41.000000000 +0200 | |
18 | --- src/eval.c 2011-04-11 13:28:34.000000000 +0200 | |
19 | *************** | |
20 | *** 853,858 **** | |
21 | --- 853,859 ---- | |
22 | ||
23 | init_var_dict(&globvardict, &globvars_var); | |
24 | init_var_dict(&vimvardict, &vimvars_var); | |
25 | + vimvardict.dv_lock = VAR_FIXED; | |
26 | hash_init(&compat_hashtab); | |
27 | hash_init(&func_hashtab); | |
28 | ||
29 | *************** | |
30 | *** 8545,8551 **** | |
31 | if (argvars[0].v_type == VAR_LIST) | |
32 | { | |
33 | if ((l = argvars[0].vval.v_list) != NULL | |
34 | ! && !tv_check_lock(l->lv_lock, (char_u *)"add()") | |
35 | && list_append_tv(l, &argvars[1]) == OK) | |
36 | copy_tv(&argvars[0], rettv); | |
37 | } | |
38 | --- 8546,8552 ---- | |
39 | if (argvars[0].v_type == VAR_LIST) | |
40 | { | |
41 | if ((l = argvars[0].vval.v_list) != NULL | |
42 | ! && !tv_check_lock(l->lv_lock, (char_u *)_("add() argument")) | |
43 | && list_append_tv(l, &argvars[1]) == OK) | |
44 | copy_tv(&argvars[0], rettv); | |
45 | } | |
46 | *************** | |
47 | *** 9946,9951 **** | |
48 | --- 9947,9954 ---- | |
49 | typval_T *argvars; | |
50 | typval_T *rettv; | |
51 | { | |
52 | + char *arg_errmsg = N_("extend() argument"); | |
53 | + | |
54 | if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_LIST) | |
55 | { | |
56 | list_T *l1, *l2; | |
57 | *************** | |
58 | *** 9955,9961 **** | |
59 | ||
60 | l1 = argvars[0].vval.v_list; | |
61 | l2 = argvars[1].vval.v_list; | |
62 | ! if (l1 != NULL && !tv_check_lock(l1->lv_lock, (char_u *)"extend()") | |
63 | && l2 != NULL) | |
64 | { | |
65 | if (argvars[2].v_type != VAR_UNKNOWN) | |
66 | --- 9958,9964 ---- | |
67 | ||
68 | l1 = argvars[0].vval.v_list; | |
69 | l2 = argvars[1].vval.v_list; | |
70 | ! if (l1 != NULL && !tv_check_lock(l1->lv_lock, (char_u *)_(arg_errmsg)) | |
71 | && l2 != NULL) | |
72 | { | |
73 | if (argvars[2].v_type != VAR_UNKNOWN) | |
74 | *************** | |
75 | *** 9994,10000 **** | |
76 | ||
77 | d1 = argvars[0].vval.v_dict; | |
78 | d2 = argvars[1].vval.v_dict; | |
79 | ! if (d1 != NULL && !tv_check_lock(d1->dv_lock, (char_u *)"extend()") | |
80 | && d2 != NULL) | |
81 | { | |
82 | /* Check the third argument. */ | |
83 | --- 9997,10003 ---- | |
84 | ||
85 | d1 = argvars[0].vval.v_dict; | |
86 | d2 = argvars[1].vval.v_dict; | |
87 | ! if (d1 != NULL && !tv_check_lock(d1->dv_lock, (char_u *)_(arg_errmsg)) | |
88 | && d2 != NULL) | |
89 | { | |
90 | /* Check the third argument. */ | |
91 | *************** | |
92 | *** 10236,10255 **** | |
93 | typval_T save_key; | |
94 | int rem; | |
95 | int todo; | |
96 | ! char_u *ermsg = map ? (char_u *)"map()" : (char_u *)"filter()"; | |
97 | int save_did_emsg; | |
98 | int idx = 0; | |
99 | ||
100 | if (argvars[0].v_type == VAR_LIST) | |
101 | { | |
102 | if ((l = argvars[0].vval.v_list) == NULL | |
103 | ! || (map && tv_check_lock(l->lv_lock, ermsg))) | |
104 | return; | |
105 | } | |
106 | else if (argvars[0].v_type == VAR_DICT) | |
107 | { | |
108 | if ((d = argvars[0].vval.v_dict) == NULL | |
109 | ! || (map && tv_check_lock(d->dv_lock, ermsg))) | |
110 | return; | |
111 | } | |
112 | else | |
113 | --- 10239,10260 ---- | |
114 | typval_T save_key; | |
115 | int rem; | |
116 | int todo; | |
117 | ! char_u *ermsg = (char_u *)(map ? "map()" : "filter()"); | |
118 | ! char *arg_errmsg = (map ? N_("map() argument") | |
119 | ! : N_("filter() argument")); | |
120 | int save_did_emsg; | |
121 | int idx = 0; | |
122 | ||
123 | if (argvars[0].v_type == VAR_LIST) | |
124 | { | |
125 | if ((l = argvars[0].vval.v_list) == NULL | |
126 | ! || tv_check_lock(l->lv_lock, (char_u *)_(arg_errmsg))) | |
127 | return; | |
128 | } | |
129 | else if (argvars[0].v_type == VAR_DICT) | |
130 | { | |
131 | if ((d = argvars[0].vval.v_dict) == NULL | |
132 | ! || tv_check_lock(d->dv_lock, (char_u *)_(arg_errmsg))) | |
133 | return; | |
134 | } | |
135 | else | |
136 | *************** | |
137 | *** 10286,10292 **** | |
138 | { | |
139 | --todo; | |
140 | di = HI2DI(hi); | |
141 | ! if (tv_check_lock(di->di_tv.v_lock, ermsg)) | |
142 | break; | |
143 | vimvars[VV_KEY].vv_str = vim_strsave(di->di_key); | |
144 | if (filter_map_one(&di->di_tv, expr, map, &rem) == FAIL | |
145 | --- 10291,10298 ---- | |
146 | { | |
147 | --todo; | |
148 | di = HI2DI(hi); | |
149 | ! if (tv_check_lock(di->di_tv.v_lock, | |
150 | ! (char_u *)_(arg_errmsg))) | |
151 | break; | |
152 | vimvars[VV_KEY].vv_str = vim_strsave(di->di_key); | |
153 | if (filter_map_one(&di->di_tv, expr, map, &rem) == FAIL | |
154 | *************** | |
155 | *** 10305,10311 **** | |
156 | ||
157 | for (li = l->lv_first; li != NULL; li = nli) | |
158 | { | |
159 | ! if (tv_check_lock(li->li_tv.v_lock, ermsg)) | |
160 | break; | |
161 | nli = li->li_next; | |
162 | vimvars[VV_KEY].vv_nr = idx; | |
163 | --- 10311,10317 ---- | |
164 | ||
165 | for (li = l->lv_first; li != NULL; li = nli) | |
166 | { | |
167 | ! if (tv_check_lock(li->li_tv.v_lock, (char_u *)_(arg_errmsg))) | |
168 | break; | |
169 | nli = li->li_next; | |
170 | vimvars[VV_KEY].vv_nr = idx; | |
171 | *************** | |
172 | *** 12910,12916 **** | |
173 | if (argvars[0].v_type != VAR_LIST) | |
174 | EMSG2(_(e_listarg), "insert()"); | |
175 | else if ((l = argvars[0].vval.v_list) != NULL | |
176 | ! && !tv_check_lock(l->lv_lock, (char_u *)"insert()")) | |
177 | { | |
178 | if (argvars[2].v_type != VAR_UNKNOWN) | |
179 | before = get_tv_number_chk(&argvars[2], &error); | |
180 | --- 12916,12922 ---- | |
181 | if (argvars[0].v_type != VAR_LIST) | |
182 | EMSG2(_(e_listarg), "insert()"); | |
183 | else if ((l = argvars[0].vval.v_list) != NULL | |
184 | ! && !tv_check_lock(l->lv_lock, (char_u *)_("insert() argument"))) | |
185 | { | |
186 | if (argvars[2].v_type != VAR_UNKNOWN) | |
187 | before = get_tv_number_chk(&argvars[2], &error); | |
188 | *************** | |
189 | *** 14775,14787 **** | |
190 | char_u *key; | |
191 | dict_T *d; | |
192 | dictitem_T *di; | |
193 | ||
194 | if (argvars[0].v_type == VAR_DICT) | |
195 | { | |
196 | if (argvars[2].v_type != VAR_UNKNOWN) | |
197 | EMSG2(_(e_toomanyarg), "remove()"); | |
198 | else if ((d = argvars[0].vval.v_dict) != NULL | |
199 | ! && !tv_check_lock(d->dv_lock, (char_u *)"remove() argument")) | |
200 | { | |
201 | key = get_tv_string_chk(&argvars[1]); | |
202 | if (key != NULL) | |
203 | --- 14781,14794 ---- | |
204 | char_u *key; | |
205 | dict_T *d; | |
206 | dictitem_T *di; | |
207 | + char *arg_errmsg = N_("remove() argument"); | |
208 | ||
209 | if (argvars[0].v_type == VAR_DICT) | |
210 | { | |
211 | if (argvars[2].v_type != VAR_UNKNOWN) | |
212 | EMSG2(_(e_toomanyarg), "remove()"); | |
213 | else if ((d = argvars[0].vval.v_dict) != NULL | |
214 | ! && !tv_check_lock(d->dv_lock, (char_u *)_(arg_errmsg))) | |
215 | { | |
216 | key = get_tv_string_chk(&argvars[1]); | |
217 | if (key != NULL) | |
218 | *************** | |
219 | *** 14801,14807 **** | |
220 | else if (argvars[0].v_type != VAR_LIST) | |
221 | EMSG2(_(e_listdictarg), "remove()"); | |
222 | else if ((l = argvars[0].vval.v_list) != NULL | |
223 | ! && !tv_check_lock(l->lv_lock, (char_u *)"remove() argument")) | |
224 | { | |
225 | int error = FALSE; | |
226 | ||
227 | --- 14808,14814 ---- | |
228 | else if (argvars[0].v_type != VAR_LIST) | |
229 | EMSG2(_(e_listdictarg), "remove()"); | |
230 | else if ((l = argvars[0].vval.v_list) != NULL | |
231 | ! && !tv_check_lock(l->lv_lock, (char_u *)_(arg_errmsg))) | |
232 | { | |
233 | int error = FALSE; | |
234 | ||
235 | *************** | |
236 | *** 15135,15141 **** | |
237 | if (argvars[0].v_type != VAR_LIST) | |
238 | EMSG2(_(e_listarg), "reverse()"); | |
239 | else if ((l = argvars[0].vval.v_list) != NULL | |
240 | ! && !tv_check_lock(l->lv_lock, (char_u *)"reverse()")) | |
241 | { | |
242 | li = l->lv_last; | |
243 | l->lv_first = l->lv_last = NULL; | |
244 | --- 15142,15148 ---- | |
245 | if (argvars[0].v_type != VAR_LIST) | |
246 | EMSG2(_(e_listarg), "reverse()"); | |
247 | else if ((l = argvars[0].vval.v_list) != NULL | |
248 | ! && !tv_check_lock(l->lv_lock, (char_u *)_("reverse() argument"))) | |
249 | { | |
250 | li = l->lv_last; | |
251 | l->lv_first = l->lv_last = NULL; | |
252 | *************** | |
253 | *** 16432,16438 **** | |
254 | else | |
255 | { | |
256 | l = argvars[0].vval.v_list; | |
257 | ! if (l == NULL || tv_check_lock(l->lv_lock, (char_u *)"sort()")) | |
258 | return; | |
259 | rettv->vval.v_list = l; | |
260 | rettv->v_type = VAR_LIST; | |
261 | --- 16439,16446 ---- | |
262 | else | |
263 | { | |
264 | l = argvars[0].vval.v_list; | |
265 | ! if (l == NULL || tv_check_lock(l->lv_lock, | |
266 | ! (char_u *)_("sort() argument"))) | |
267 | return; | |
268 | rettv->vval.v_list = l; | |
269 | rettv->v_type = VAR_LIST; | |
270 | *** ../vim-7.3.154/src/version.c 2011-04-02 15:12:45.000000000 +0200 | |
271 | --- src/version.c 2011-04-11 13:13:38.000000000 +0200 | |
272 | *************** | |
273 | *** 716,717 **** | |
274 | --- 716,719 ---- | |
275 | { /* Add new patch number below this line */ | |
276 | + /**/ | |
277 | + 155, | |
278 | /**/ | |
279 | ||
280 | -- | |
281 | I used to be indecisive, now I'm not sure. | |
282 | ||
283 | /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ | |
284 | /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ | |
285 | \\\ an exciting new programming language -- http://www.Zimbu.org /// | |
286 | \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |