mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 8.2.0098: exe stack length can be wrong without being detected
Problem: Exe stack length can be wrong without being detected. Solution: Add a check when ABORT_ON_INTERNAL_ERROR is defined.
This commit is contained in:
@@ -1827,6 +1827,7 @@ apply_autocmds_group(
|
|||||||
int did_save_redobuff = FALSE;
|
int did_save_redobuff = FALSE;
|
||||||
save_redo_T save_redo;
|
save_redo_T save_redo;
|
||||||
int save_KeyTyped = KeyTyped;
|
int save_KeyTyped = KeyTyped;
|
||||||
|
ESTACK_CHECK_DECLARATION
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Quickly return if there are no autocommands for this event or
|
* Quickly return if there are no autocommands for this event or
|
||||||
@@ -2021,6 +2022,7 @@ apply_autocmds_group(
|
|||||||
|
|
||||||
// name and lnum are filled in later
|
// name and lnum are filled in later
|
||||||
estack_push(ETYPE_AUCMD, NULL, 0);
|
estack_push(ETYPE_AUCMD, NULL, 0);
|
||||||
|
ESTACK_CHECK_SETUP
|
||||||
|
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
save_current_sctx = current_sctx;
|
save_current_sctx = current_sctx;
|
||||||
@@ -2124,6 +2126,7 @@ apply_autocmds_group(
|
|||||||
filechangeshell_busy = FALSE;
|
filechangeshell_busy = FALSE;
|
||||||
autocmd_nested = save_autocmd_nested;
|
autocmd_nested = save_autocmd_nested;
|
||||||
vim_free(SOURCING_NAME);
|
vim_free(SOURCING_NAME);
|
||||||
|
ESTACK_CHECK_NOW
|
||||||
estack_pop();
|
estack_pop();
|
||||||
vim_free(autocmd_fname);
|
vim_free(autocmd_fname);
|
||||||
autocmd_fname = save_autocmd_fname;
|
autocmd_fname = save_autocmd_fname;
|
||||||
|
@@ -5287,6 +5287,7 @@ chk_modeline(
|
|||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
sctx_T save_current_sctx;
|
sctx_T save_current_sctx;
|
||||||
#endif
|
#endif
|
||||||
|
ESTACK_CHECK_DECLARATION
|
||||||
|
|
||||||
prev = -1;
|
prev = -1;
|
||||||
for (s = ml_get(lnum); *s != NUL; ++s)
|
for (s = ml_get(lnum); *s != NUL; ++s)
|
||||||
@@ -5330,6 +5331,7 @@ chk_modeline(
|
|||||||
|
|
||||||
// prepare for emsg()
|
// prepare for emsg()
|
||||||
estack_push(ETYPE_MODELINE, (char_u *)"modelines", lnum);
|
estack_push(ETYPE_MODELINE, (char_u *)"modelines", lnum);
|
||||||
|
ESTACK_CHECK_SETUP
|
||||||
|
|
||||||
end = FALSE;
|
end = FALSE;
|
||||||
while (end == FALSE)
|
while (end == FALSE)
|
||||||
@@ -5390,6 +5392,7 @@ chk_modeline(
|
|||||||
s = e + 1; // advance to next part
|
s = e + 1; // advance to next part
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ESTACK_CHECK_NOW
|
||||||
estack_pop();
|
estack_pop();
|
||||||
vim_free(linecopy);
|
vim_free(linecopy);
|
||||||
}
|
}
|
||||||
|
@@ -645,6 +645,7 @@ do_cmdline(
|
|||||||
# define cmd_cookie cookie
|
# define cmd_cookie cookie
|
||||||
#endif
|
#endif
|
||||||
static int call_depth = 0; // recursiveness
|
static int call_depth = 0; // recursiveness
|
||||||
|
ESTACK_CHECK_DECLARATION
|
||||||
|
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
// For every pair of do_cmdline()/do_one_cmd() calls, use an extra memory
|
// For every pair of do_cmdline()/do_one_cmd() calls, use an extra memory
|
||||||
@@ -1260,6 +1261,7 @@ do_cmdline(
|
|||||||
|
|
||||||
estack_push(ETYPE_EXCEPT, current_exception->throw_name,
|
estack_push(ETYPE_EXCEPT, current_exception->throw_name,
|
||||||
current_exception->throw_lnum);
|
current_exception->throw_lnum);
|
||||||
|
ESTACK_CHECK_SETUP
|
||||||
current_exception->throw_name = NULL;
|
current_exception->throw_name = NULL;
|
||||||
|
|
||||||
discard_current_exception(); // uses IObuff if 'verbose'
|
discard_current_exception(); // uses IObuff if 'verbose'
|
||||||
@@ -1284,6 +1286,7 @@ do_cmdline(
|
|||||||
vim_free(p);
|
vim_free(p);
|
||||||
}
|
}
|
||||||
vim_free(SOURCING_NAME);
|
vim_free(SOURCING_NAME);
|
||||||
|
ESTACK_CHECK_NOW
|
||||||
estack_pop();
|
estack_pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
12
src/macros.h
12
src/macros.h
@@ -344,3 +344,15 @@
|
|||||||
#else
|
#else
|
||||||
# define ERROR_IF_POPUP_WINDOW 0
|
# define ERROR_IF_POPUP_WINDOW 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ABORT_ON_INTERNAL_ERROR
|
||||||
|
# define ESTACK_CHECK_DECLARATION int estack_len_before;
|
||||||
|
# define ESTACK_CHECK_SETUP estack_len_before = exestack.ga_len;
|
||||||
|
# define ESTACK_CHECK_NOW if (estack_len_before != exestack.ga_len) \
|
||||||
|
siemsg("Exestack length expected: %d, actual: %d", estack_len_before, exestack.ga_len);
|
||||||
|
#else
|
||||||
|
# define ESTACK_CHECK_DECLARATION
|
||||||
|
# define ESTACK_CHECK_SETUP
|
||||||
|
# define ESTACK_CHECK_NOW
|
||||||
|
#endif
|
||||||
|
@@ -3086,16 +3086,19 @@ exe_pre_commands(mparm_T *parmp)
|
|||||||
char_u **cmds = parmp->pre_commands;
|
char_u **cmds = parmp->pre_commands;
|
||||||
int cnt = parmp->n_pre_commands;
|
int cnt = parmp->n_pre_commands;
|
||||||
int i;
|
int i;
|
||||||
|
ESTACK_CHECK_DECLARATION
|
||||||
|
|
||||||
if (cnt > 0)
|
if (cnt > 0)
|
||||||
{
|
{
|
||||||
curwin->w_cursor.lnum = 0; // just in case..
|
curwin->w_cursor.lnum = 0; // just in case..
|
||||||
estack_push(ETYPE_ARGS, (char_u *)_("pre-vimrc command line"), 0);
|
estack_push(ETYPE_ARGS, (char_u *)_("pre-vimrc command line"), 0);
|
||||||
|
ESTACK_CHECK_SETUP
|
||||||
# ifdef FEAT_EVAL
|
# ifdef FEAT_EVAL
|
||||||
current_sctx.sc_sid = SID_CMDARG;
|
current_sctx.sc_sid = SID_CMDARG;
|
||||||
# endif
|
# endif
|
||||||
for (i = 0; i < cnt; ++i)
|
for (i = 0; i < cnt; ++i)
|
||||||
do_cmdline_cmd(cmds[i]);
|
do_cmdline_cmd(cmds[i]);
|
||||||
|
ESTACK_CHECK_NOW
|
||||||
estack_pop();
|
estack_pop();
|
||||||
# ifdef FEAT_EVAL
|
# ifdef FEAT_EVAL
|
||||||
current_sctx.sc_sid = 0;
|
current_sctx.sc_sid = 0;
|
||||||
@@ -3111,6 +3114,7 @@ exe_pre_commands(mparm_T *parmp)
|
|||||||
exe_commands(mparm_T *parmp)
|
exe_commands(mparm_T *parmp)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
ESTACK_CHECK_DECLARATION
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We start commands on line 0, make "vim +/pat file" match a
|
* We start commands on line 0, make "vim +/pat file" match a
|
||||||
@@ -3121,6 +3125,7 @@ exe_commands(mparm_T *parmp)
|
|||||||
if (parmp->tagname == NULL && curwin->w_cursor.lnum <= 1)
|
if (parmp->tagname == NULL && curwin->w_cursor.lnum <= 1)
|
||||||
curwin->w_cursor.lnum = 0;
|
curwin->w_cursor.lnum = 0;
|
||||||
estack_push(ETYPE_ARGS, (char_u *)"command line", 0);
|
estack_push(ETYPE_ARGS, (char_u *)"command line", 0);
|
||||||
|
ESTACK_CHECK_SETUP
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
current_sctx.sc_sid = SID_CARG;
|
current_sctx.sc_sid = SID_CARG;
|
||||||
current_sctx.sc_seq = 0;
|
current_sctx.sc_seq = 0;
|
||||||
@@ -3131,6 +3136,7 @@ exe_commands(mparm_T *parmp)
|
|||||||
if (parmp->cmds_tofree[i])
|
if (parmp->cmds_tofree[i])
|
||||||
vim_free(parmp->commands[i]);
|
vim_free(parmp->commands[i]);
|
||||||
}
|
}
|
||||||
|
ESTACK_CHECK_NOW
|
||||||
estack_pop();
|
estack_pop();
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
current_sctx.sc_sid = 0;
|
current_sctx.sc_sid = 0;
|
||||||
@@ -3340,12 +3346,14 @@ process_env(
|
|||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
sctx_T save_current_sctx;
|
sctx_T save_current_sctx;
|
||||||
#endif
|
#endif
|
||||||
|
ESTACK_CHECK_DECLARATION
|
||||||
|
|
||||||
if ((initstr = mch_getenv(env)) != NULL && *initstr != NUL)
|
if ((initstr = mch_getenv(env)) != NULL && *initstr != NUL)
|
||||||
{
|
{
|
||||||
if (is_viminit)
|
if (is_viminit)
|
||||||
vimrc_found(NULL, NULL);
|
vimrc_found(NULL, NULL);
|
||||||
estack_push(ETYPE_ENV, env, 0);
|
estack_push(ETYPE_ENV, env, 0);
|
||||||
|
ESTACK_CHECK_SETUP
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
save_current_sctx = current_sctx;
|
save_current_sctx = current_sctx;
|
||||||
current_sctx.sc_sid = SID_ENV;
|
current_sctx.sc_sid = SID_ENV;
|
||||||
@@ -3355,6 +3363,7 @@ process_env(
|
|||||||
#endif
|
#endif
|
||||||
do_cmdline_cmd(initstr);
|
do_cmdline_cmd(initstr);
|
||||||
|
|
||||||
|
ESTACK_CHECK_NOW
|
||||||
estack_pop();
|
estack_pop();
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
current_sctx = save_current_sctx;
|
current_sctx = save_current_sctx;
|
||||||
|
@@ -1918,10 +1918,12 @@ check_map_keycodes(void)
|
|||||||
int abbr;
|
int abbr;
|
||||||
int hash;
|
int hash;
|
||||||
buf_T *bp;
|
buf_T *bp;
|
||||||
|
ESTACK_CHECK_DECLARATION
|
||||||
|
|
||||||
validate_maphash();
|
validate_maphash();
|
||||||
// avoids giving error messages
|
// avoids giving error messages
|
||||||
estack_push(ETYPE_INTERNAL, (char_u *)"mappings", 0);
|
estack_push(ETYPE_INTERNAL, (char_u *)"mappings", 0);
|
||||||
|
ESTACK_CHECK_SETUP
|
||||||
|
|
||||||
// Do this once for each buffer, and then once for global
|
// Do this once for each buffer, and then once for global
|
||||||
// mappings/abbreviations with bp == NULL
|
// mappings/abbreviations with bp == NULL
|
||||||
@@ -1978,6 +1980,7 @@ check_map_keycodes(void)
|
|||||||
if (bp == NULL)
|
if (bp == NULL)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
ESTACK_CHECK_NOW
|
||||||
estack_pop();
|
estack_pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1099,6 +1099,7 @@ do_source(
|
|||||||
proftime_T wait_start;
|
proftime_T wait_start;
|
||||||
#endif
|
#endif
|
||||||
int trigger_source_post = FALSE;
|
int trigger_source_post = FALSE;
|
||||||
|
ESTACK_CHECK_DECLARATION
|
||||||
|
|
||||||
p = expand_env_save(fname);
|
p = expand_env_save(fname);
|
||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
@@ -1216,6 +1217,7 @@ do_source(
|
|||||||
|
|
||||||
// Keep the sourcing name/lnum, for recursive calls.
|
// Keep the sourcing name/lnum, for recursive calls.
|
||||||
estack_push(ETYPE_SCRIPT, fname_exp, 0);
|
estack_push(ETYPE_SCRIPT, fname_exp, 0);
|
||||||
|
ESTACK_CHECK_SETUP
|
||||||
|
|
||||||
#ifdef STARTUPTIME
|
#ifdef STARTUPTIME
|
||||||
if (time_fd != NULL)
|
if (time_fd != NULL)
|
||||||
@@ -1355,6 +1357,7 @@ do_source(
|
|||||||
|
|
||||||
if (got_int)
|
if (got_int)
|
||||||
emsg(_(e_interr));
|
emsg(_(e_interr));
|
||||||
|
ESTACK_CHECK_NOW
|
||||||
estack_pop();
|
estack_pop();
|
||||||
if (p_verbose > 1)
|
if (p_verbose > 1)
|
||||||
{
|
{
|
||||||
|
@@ -353,6 +353,7 @@ spell_load_file(
|
|||||||
int c = 0;
|
int c = 0;
|
||||||
int res;
|
int res;
|
||||||
int did_estack_push = FALSE;
|
int did_estack_push = FALSE;
|
||||||
|
ESTACK_CHECK_DECLARATION
|
||||||
|
|
||||||
fd = mch_fopen((char *)fname, "r");
|
fd = mch_fopen((char *)fname, "r");
|
||||||
if (fd == NULL)
|
if (fd == NULL)
|
||||||
@@ -393,6 +394,7 @@ spell_load_file(
|
|||||||
|
|
||||||
// Set sourcing_name, so that error messages mention the file name.
|
// Set sourcing_name, so that error messages mention the file name.
|
||||||
estack_push(ETYPE_SPELL, fname, 0);
|
estack_push(ETYPE_SPELL, fname, 0);
|
||||||
|
ESTACK_CHECK_SETUP
|
||||||
did_estack_push = TRUE;
|
did_estack_push = TRUE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -581,7 +583,10 @@ endOK:
|
|||||||
if (fd != NULL)
|
if (fd != NULL)
|
||||||
fclose(fd);
|
fclose(fd);
|
||||||
if (did_estack_push)
|
if (did_estack_push)
|
||||||
|
{
|
||||||
|
ESTACK_CHECK_NOW
|
||||||
estack_pop();
|
estack_pop();
|
||||||
|
}
|
||||||
|
|
||||||
return lp;
|
return lp;
|
||||||
}
|
}
|
||||||
|
@@ -793,6 +793,7 @@ call_user_func(
|
|||||||
proftime_T call_start;
|
proftime_T call_start;
|
||||||
int started_profiling = FALSE;
|
int started_profiling = FALSE;
|
||||||
#endif
|
#endif
|
||||||
|
ESTACK_CHECK_DECLARATION
|
||||||
|
|
||||||
// If depth of calling is getting too high, don't execute the function
|
// If depth of calling is getting too high, don't execute the function
|
||||||
if (depth >= p_mfd)
|
if (depth >= p_mfd)
|
||||||
@@ -969,6 +970,7 @@ call_user_func(
|
|||||||
}
|
}
|
||||||
|
|
||||||
estack_push_ufunc(ETYPE_UFUNC, fp, 1);
|
estack_push_ufunc(ETYPE_UFUNC, fp, 1);
|
||||||
|
ESTACK_CHECK_SETUP
|
||||||
if (p_verbose >= 12)
|
if (p_verbose >= 12)
|
||||||
{
|
{
|
||||||
++no_wait_return;
|
++no_wait_return;
|
||||||
@@ -1115,6 +1117,7 @@ call_user_func(
|
|||||||
--no_wait_return;
|
--no_wait_return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ESTACK_CHECK_NOW
|
||||||
estack_pop();
|
estack_pop();
|
||||||
current_sctx = save_current_sctx;
|
current_sctx = save_current_sctx;
|
||||||
#ifdef FEAT_PROFILE
|
#ifdef FEAT_PROFILE
|
||||||
|
@@ -742,6 +742,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 */
|
||||||
|
/**/
|
||||||
|
98,
|
||||||
/**/
|
/**/
|
||||||
97,
|
97,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user