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:
parent
23d44493f1
commit
c9af617ac6
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user