comparison src/vim9compile.c @ 28678:a16dae0be398 v8.2.4863

patch 8.2.4863: accessing freed memory in test without the +channel feature Commit: https://github.com/vim/vim/commit/c9af617ac62b15bfcbbfe8c54071146e2af01f65 Author: Bram Moolenaar <Bram@vim.org> Date: Wed May 4 16:46:54 2022 +0100 patch 8.2.4863: accessing freed memory in test without the +channel feature Problem: Accessing freed memory in test without the +channel feature. (Dominique Pell?) Solution: Do not generted PUSHCHANNEL or PUSHJOB if they are not implemented. (closes #10350)
author Bram Moolenaar <Bram@vim.org>
date Wed, 04 May 2022 18:00:04 +0200
parents d550054e1328
children 7f12fe85ed8b
comparison
equal deleted inserted replaced
28677:aefbe6115141 28678:a16dae0be398
2291 emsg(_(e_type_or_initialization_required)); 2291 emsg(_(e_type_or_initialization_required));
2292 goto theend; 2292 goto theend;
2293 } 2293 }
2294 else 2294 else
2295 { 2295 {
2296 int r = OK;
2297
2296 // variables are always initialized 2298 // variables are always initialized
2297 if (GA_GROW_FAILS(instr, 1)) 2299 if (GA_GROW_FAILS(instr, 1))
2298 goto theend; 2300 goto theend;
2299 switch (lhs.lhs_member_type->tt_type) 2301 switch (lhs.lhs_member_type->tt_type)
2300 { 2302 {
2301 case VAR_BOOL: 2303 case VAR_BOOL:
2302 generate_PUSHBOOL(cctx, VVAL_FALSE); 2304 r = generate_PUSHBOOL(cctx, VVAL_FALSE);
2303 break; 2305 break;
2304 case VAR_FLOAT: 2306 case VAR_FLOAT:
2305 #ifdef FEAT_FLOAT 2307 #ifdef FEAT_FLOAT
2306 generate_PUSHF(cctx, 0.0); 2308 r = generate_PUSHF(cctx, 0.0);
2307 #endif 2309 #endif
2308 break; 2310 break;
2309 case VAR_STRING: 2311 case VAR_STRING:
2310 generate_PUSHS(cctx, NULL); 2312 r = generate_PUSHS(cctx, NULL);
2311 break; 2313 break;
2312 case VAR_BLOB: 2314 case VAR_BLOB:
2313 generate_PUSHBLOB(cctx, blob_alloc()); 2315 r = generate_PUSHBLOB(cctx, blob_alloc());
2314 break; 2316 break;
2315 case VAR_FUNC: 2317 case VAR_FUNC:
2316 generate_PUSHFUNC(cctx, NULL, &t_func_void); 2318 r = generate_PUSHFUNC(cctx, NULL, &t_func_void);
2317 break; 2319 break;
2318 case VAR_LIST: 2320 case VAR_LIST:
2319 generate_NEWLIST(cctx, 0, FALSE); 2321 r = generate_NEWLIST(cctx, 0, FALSE);
2320 break; 2322 break;
2321 case VAR_DICT: 2323 case VAR_DICT:
2322 generate_NEWDICT(cctx, 0, FALSE); 2324 r = generate_NEWDICT(cctx, 0, FALSE);
2323 break; 2325 break;
2324 case VAR_JOB: 2326 case VAR_JOB:
2325 generate_PUSHJOB(cctx); 2327 r = generate_PUSHJOB(cctx);
2326 break; 2328 break;
2327 case VAR_CHANNEL: 2329 case VAR_CHANNEL:
2328 generate_PUSHCHANNEL(cctx); 2330 r = generate_PUSHCHANNEL(cctx);
2329 break; 2331 break;
2330 case VAR_NUMBER: 2332 case VAR_NUMBER:
2331 case VAR_UNKNOWN: 2333 case VAR_UNKNOWN:
2332 case VAR_ANY: 2334 case VAR_ANY:
2333 case VAR_PARTIAL: 2335 case VAR_PARTIAL:
2341 && !inside_loop_scope(cctx)) 2343 && !inside_loop_scope(cctx))
2342 skip_store = TRUE; 2344 skip_store = TRUE;
2343 else 2345 else
2344 { 2346 {
2345 instr_count = instr->ga_len; 2347 instr_count = instr->ga_len;
2346 generate_PUSHNR(cctx, 0); 2348 r = generate_PUSHNR(cctx, 0);
2347 } 2349 }
2348 break; 2350 break;
2349 } 2351 }
2352 if (r == FAIL)
2353 goto theend;
2350 } 2354 }
2351 if (var_count == 0) 2355 if (var_count == 0)
2352 end = p; 2356 end = p;
2353 } 2357 }
2354 2358