Patch 8.2.4863
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)
Files: src/vim9instr.c, src/errors.h, src/vim9compile.c,
src/testdir/test_vim9_script.vim
*** ../vim-8.2.4862/src/vim9instr.c 2022-04-27 17:54:20.147363240 +0100
--- src/vim9instr.c 2022-05-04 16:38:34.321675911 +0100
***************
*** 755,766 ****
--- 755,773 ----
int
generate_PUSHCHANNEL(cctx_T *cctx)
{
+ #ifdef FEAT_JOB_CHANNEL
isn_T *isn;
+ #endif
RETURN_OK_IF_SKIP(cctx);
+ #ifdef FEAT_JOB_CHANNEL
if ((isn = generate_instr_type(cctx, ISN_PUSHCHANNEL, &t_channel)) ==
NULL)
return FAIL;
return OK;
+ #else
+ emsg(_(e_channel_job_feature_not_available));
+ return FAIL;
+ #endif
}
/*
***************
*** 769,780 ****
--- 776,794 ----
int
generate_PUSHJOB(cctx_T *cctx)
{
+ #ifdef FEAT_JOB_CHANNEL
isn_T *isn;
+ #endif
RETURN_OK_IF_SKIP(cctx);
+ #ifdef FEAT_JOB_CHANNEL
if ((isn = generate_instr_type(cctx, ISN_PUSHJOB, &t_job)) == NULL)
return FAIL;
return OK;
+ #else
+ emsg(_(e_channel_job_feature_not_available));
+ return FAIL;
+ #endif
}
/*
*** ../vim-8.2.4862/src/errors.h 2022-05-04 15:40:16.032317666 +0100
--- src/errors.h 2022-05-04 16:34:11.749873513 +0100
***************
*** 3264,3267 ****
--- 3264,3271 ----
INIT(= N_("E1275: String or function required for ->(expr)"));
EXTERN char e_illegal_map_mode_string_str[]
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
*** ../vim-8.2.4862/src/vim9compile.c 2022-04-25 12:43:15.175819215 +0100
--- src/vim9compile.c 2022-05-04 16:42:36.053500087 +0100
***************
*** 2293,2331 ****
}
else
{
// variables are always initialized
if (GA_GROW_FAILS(instr, 1))
goto theend;
switch (lhs.lhs_member_type->tt_type)
{
case VAR_BOOL:
! generate_PUSHBOOL(cctx, VVAL_FALSE);
break;
case VAR_FLOAT:
#ifdef FEAT_FLOAT
! generate_PUSHF(cctx, 0.0);
#endif
break;
case VAR_STRING:
! generate_PUSHS(cctx, NULL);
break;
case VAR_BLOB:
! generate_PUSHBLOB(cctx, blob_alloc());
break;
case VAR_FUNC:
! generate_PUSHFUNC(cctx, NULL, &t_func_void);
break;
case VAR_LIST:
! generate_NEWLIST(cctx, 0, FALSE);
break;
case VAR_DICT:
! generate_NEWDICT(cctx, 0, FALSE);
break;
case VAR_JOB:
! generate_PUSHJOB(cctx);
break;
case VAR_CHANNEL:
! generate_PUSHCHANNEL(cctx);
break;
case VAR_NUMBER:
case VAR_UNKNOWN:
--- 2293,2333 ----
}
else
{
+ int r = OK;
+
// variables are always initialized
if (GA_GROW_FAILS(instr, 1))
goto theend;
switch (lhs.lhs_member_type->tt_type)
{
case VAR_BOOL:
! r = generate_PUSHBOOL(cctx, VVAL_FALSE);
break;
case VAR_FLOAT:
#ifdef FEAT_FLOAT
! r = generate_PUSHF(cctx, 0.0);
#endif
break;
case VAR_STRING:
! r = generate_PUSHS(cctx, NULL);
break;
case VAR_BLOB:
! r = generate_PUSHBLOB(cctx, blob_alloc());
break;
case VAR_FUNC:
! r = generate_PUSHFUNC(cctx, NULL, &t_func_void);
break;
case VAR_LIST:
! r = generate_NEWLIST(cctx, 0, FALSE);
break;
case VAR_DICT:
! r = generate_NEWDICT(cctx, 0, FALSE);
break;
case VAR_JOB:
! r = generate_PUSHJOB(cctx);
break;
case VAR_CHANNEL:
! r = generate_PUSHCHANNEL(cctx);
break;
case VAR_NUMBER:
case VAR_UNKNOWN:
***************
*** 2343,2352 ****
else
{
instr_count = instr->ga_len;
! generate_PUSHNR(cctx, 0);
}
break;
}
}
if (var_count == 0)
end = p;
--- 2345,2356 ----
else
{
instr_count = instr->ga_len;
! r = generate_PUSHNR(cctx, 0);
}
break;
}
+ if (r == FAIL)
+ goto theend;
}
if (var_count == 0)
end = p;
*** ../vim-8.2.4862/src/testdir/test_vim9_script.vim 2022-05-04
16:24:54.182341138 +0100
--- src/testdir/test_vim9_script.vim 2022-05-04 16:45:15.425386277 +0100
***************
*** 4132,4139 ****
var Var_func: func
var var_string: string
var var_blob: blob
! var var_job: job
! var var_channel: channel
var var_list: list<any>
var var_dict: dict<any>
--- 4132,4141 ----
var Var_func: func
var var_string: string
var var_blob: blob
! if has('job')
! var var_job: job
! var var_channel: channel
! endif
var var_list: list<any>
var var_dict: dict<any>
***************
*** 4144,4151 ****
echo Var_func
echo var_string
echo var_blob
! echo var_job
! echo var_channel
echo var_list
echo var_dict
redir END
--- 4146,4158 ----
echo Var_func
echo var_string
echo var_blob
! if has('job')
! echo var_job
! echo var_channel
! else
! echo 'no process'
! echo 'channel fail'
! endif
echo var_list
echo var_dict
redir END
*** ../vim-8.2.4862/src/version.c 2022-05-04 16:24:54.182341138 +0100
--- src/version.c 2022-05-04 16:29:49.002082547 +0100
***************
*** 748,749 ****
--- 748,751 ----
{ /* Add new patch number below this line */
+ /**/
+ 4863,
/**/
--
>From "know your smileys":
:-E Has major dental problems
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/20220504154720.0C6351C19BB%40moolenaar.net.