0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

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)
This commit is contained in:
Bram Moolenaar 2022-05-04 16:46:54 +01:00
parent 23d44493f1
commit c9af617ac6
5 changed files with 45 additions and 14 deletions

View File

@ -3264,4 +3264,8 @@ EXTERN char e_string_or_function_required_for_arrow_parens_expr[]
INIT(= N_("E1275: String or function required for ->(expr)")); INIT(= N_("E1275: String or function required for ->(expr)"));
EXTERN char e_illegal_map_mode_string_str[] EXTERN char e_illegal_map_mode_string_str[]
INIT(= N_("E1276: Illegal map mode string: '%s'")); INIT(= N_("E1276: Illegal map mode string: '%s'"));
# if !defined(FEAT_JOB_CHANNEL)
EXTERN char e_channel_job_feature_not_available[]
INIT(= N_("E1277: Channel and job feature is not available"));
# endif
#endif #endif

View File

@ -4132,8 +4132,10 @@ def Test_echo_uninit_variables()
var Var_func: func var Var_func: func
var var_string: string var var_string: string
var var_blob: blob var var_blob: blob
if has('job')
var var_job: job var var_job: job
var var_channel: channel var var_channel: channel
endif
var var_list: list<any> var var_list: list<any>
var var_dict: dict<any> var var_dict: dict<any>
@ -4144,8 +4146,13 @@ def Test_echo_uninit_variables()
echo Var_func echo Var_func
echo var_string echo var_string
echo var_blob echo var_blob
if has('job')
echo var_job echo var_job
echo var_channel echo var_channel
else
echo 'no process'
echo 'channel fail'
endif
echo var_list echo var_list
echo var_dict echo var_dict
redir END redir END

View File

@ -746,6 +746,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
4863,
/**/ /**/
4862, 4862,
/**/ /**/

View File

@ -2293,39 +2293,41 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
} }
else else
{ {
int r = OK;
// variables are always initialized // variables are always initialized
if (GA_GROW_FAILS(instr, 1)) if (GA_GROW_FAILS(instr, 1))
goto theend; goto theend;
switch (lhs.lhs_member_type->tt_type) switch (lhs.lhs_member_type->tt_type)
{ {
case VAR_BOOL: case VAR_BOOL:
generate_PUSHBOOL(cctx, VVAL_FALSE); r = generate_PUSHBOOL(cctx, VVAL_FALSE);
break; break;
case VAR_FLOAT: case VAR_FLOAT:
#ifdef FEAT_FLOAT #ifdef FEAT_FLOAT
generate_PUSHF(cctx, 0.0); r = generate_PUSHF(cctx, 0.0);
#endif #endif
break; break;
case VAR_STRING: case VAR_STRING:
generate_PUSHS(cctx, NULL); r = generate_PUSHS(cctx, NULL);
break; break;
case VAR_BLOB: case VAR_BLOB:
generate_PUSHBLOB(cctx, blob_alloc()); r = generate_PUSHBLOB(cctx, blob_alloc());
break; break;
case VAR_FUNC: case VAR_FUNC:
generate_PUSHFUNC(cctx, NULL, &t_func_void); r = generate_PUSHFUNC(cctx, NULL, &t_func_void);
break; break;
case VAR_LIST: case VAR_LIST:
generate_NEWLIST(cctx, 0, FALSE); r = generate_NEWLIST(cctx, 0, FALSE);
break; break;
case VAR_DICT: case VAR_DICT:
generate_NEWDICT(cctx, 0, FALSE); r = generate_NEWDICT(cctx, 0, FALSE);
break; break;
case VAR_JOB: case VAR_JOB:
generate_PUSHJOB(cctx); r = generate_PUSHJOB(cctx);
break; break;
case VAR_CHANNEL: case VAR_CHANNEL:
generate_PUSHCHANNEL(cctx); r = generate_PUSHCHANNEL(cctx);
break; break;
case VAR_NUMBER: case VAR_NUMBER:
case VAR_UNKNOWN: case VAR_UNKNOWN:
@ -2343,10 +2345,12 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
else else
{ {
instr_count = instr->ga_len; instr_count = instr->ga_len;
generate_PUSHNR(cctx, 0); r = generate_PUSHNR(cctx, 0);
} }
break; break;
} }
if (r == FAIL)
goto theend;
} }
if (var_count == 0) if (var_count == 0)
end = p; end = p;

View File

@ -755,12 +755,19 @@ generate_PUSHS(cctx_T *cctx, char_u **str)
int int
generate_PUSHCHANNEL(cctx_T *cctx) generate_PUSHCHANNEL(cctx_T *cctx)
{ {
#ifdef FEAT_JOB_CHANNEL
isn_T *isn; isn_T *isn;
#endif
RETURN_OK_IF_SKIP(cctx); RETURN_OK_IF_SKIP(cctx);
#ifdef FEAT_JOB_CHANNEL
if ((isn = generate_instr_type(cctx, ISN_PUSHCHANNEL, &t_channel)) == NULL) if ((isn = generate_instr_type(cctx, ISN_PUSHCHANNEL, &t_channel)) == NULL)
return FAIL; return FAIL;
return OK; return OK;
#else
emsg(_(e_channel_job_feature_not_available));
return FAIL;
#endif
} }
/* /*
@ -769,12 +776,19 @@ generate_PUSHCHANNEL(cctx_T *cctx)
int int
generate_PUSHJOB(cctx_T *cctx) generate_PUSHJOB(cctx_T *cctx)
{ {
#ifdef FEAT_JOB_CHANNEL
isn_T *isn; isn_T *isn;
#endif
RETURN_OK_IF_SKIP(cctx); RETURN_OK_IF_SKIP(cctx);
#ifdef FEAT_JOB_CHANNEL
if ((isn = generate_instr_type(cctx, ISN_PUSHJOB, &t_job)) == NULL) if ((isn = generate_instr_type(cctx, ISN_PUSHJOB, &t_job)) == NULL)
return FAIL; return FAIL;
return OK; return OK;
#else
emsg(_(e_channel_job_feature_not_available));
return FAIL;
#endif
} }
/* /*