0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.1.0613: when executing an insecure function the secure flag is stuck

Problem:    When executing an insecure function the secure flag is stuck.
            (Gabriel Barta)
Solution:   Restore "secure" instead of decrementing it. (closes #3705)
This commit is contained in:
Bram Moolenaar
2018-12-21 13:03:28 +01:00
parent 9d302ad4e3
commit 48f377a476
4 changed files with 34 additions and 12 deletions

View File

@@ -5519,6 +5519,7 @@ chk_modeline(
if (*s != NUL) /* skip over an empty "::" */ if (*s != NUL) /* skip over an empty "::" */
{ {
int secure_save = secure;
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
save_current_sctx = current_sctx; save_current_sctx = current_sctx;
current_sctx.sc_sid = SID_MODELINE; current_sctx.sc_sid = SID_MODELINE;
@@ -5530,7 +5531,7 @@ chk_modeline(
retval = do_set(s, OPT_MODELINE | OPT_LOCAL | flags); retval = do_set(s, OPT_MODELINE | OPT_LOCAL | flags);
--secure; secure = secure_save;
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
current_sctx = save_current_sctx; current_sctx = save_current_sctx;
#endif #endif

View File

@@ -5214,7 +5214,7 @@ do_set(
{ {
long_u *p = insecure_flag(opt_idx, opt_flags); long_u *p = insecure_flag(opt_idx, opt_flags);
int did_inc_secure = FALSE; int secure_saved = secure;
// When an option is set in the sandbox, from a // When an option is set in the sandbox, from a
// modeline or in secure mode, then deal with side // modeline or in secure mode, then deal with side
@@ -5227,21 +5227,18 @@ do_set(
#endif #endif
|| (opt_flags & OPT_MODELINE) || (opt_flags & OPT_MODELINE)
|| (!value_is_replaced && (*p & P_INSECURE))) || (!value_is_replaced && (*p & P_INSECURE)))
{
did_inc_secure = TRUE;
++secure; ++secure;
}
// Handle side effects, and set the global value for // Handle side effects, and set the global value
// ":set" on local options. Note: when setting 'syntax' // for ":set" on local options. Note: when setting
// or 'filetype' autocommands may be triggered that can // 'syntax' or 'filetype' autocommands may be
// cause havoc. // triggered that can cause havoc.
errmsg = did_set_string_option(opt_idx, (char_u **)varp, errmsg = did_set_string_option(
opt_idx, (char_u **)varp,
new_value_alloced, oldval, errbuf, new_value_alloced, oldval, errbuf,
opt_flags, &value_checked); opt_flags, &value_checked);
if (did_inc_secure) secure = secure_saved;
--secure;
} }
#if defined(FEAT_EVAL) #if defined(FEAT_EVAL)

View File

@@ -650,6 +650,28 @@ func Test_OptionSet_diffmode_close()
"delfunc! AutoCommandOptionSet "delfunc! AutoCommandOptionSet
endfunc endfunc
func Test_OptionSet_modeline()
call test_override('starting', 1)
au! OptionSet
augroup set_tabstop
au OptionSet tabstop call timer_start(1, {-> execute("echo 'Handler called'", "")})
augroup END
call writefile(['vim: set ts=7 sw=5 :', 'something'], 'XoptionsetModeline')
set modeline
let v:errmsg = ''
call assert_fails('split XoptionsetModeline', 'E12:')
call assert_equal(7, &ts)
call assert_equal('', v:errmsg)
augroup set_tabstop
au!
augroup END
bwipe!
set ts&
call delete('XoptionsetModeline')
call test_override('starting', 0)
endfunc
" Test for Bufleave autocommand that deletes the buffer we are about to edit. " Test for Bufleave autocommand that deletes the buffer we are about to edit.
func Test_BufleaveWithDelete() func Test_BufleaveWithDelete()
new | edit Xfile1 new | edit Xfile1

View File

@@ -799,6 +799,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 */
/**/
613,
/**/ /**/
612, 612,
/**/ /**/