Mercurial > vim
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 |