diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-12-21 13:03:28 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-12-21 13:03:28 +0100 |
commit | 48f377a476e4a3312aa0e3535aba170484b59483 (patch) | |
tree | 6ce6c59efdaa4029fa21168d6f561039711b45d6 | |
parent | 9d302ad4e31b4e20ce0b3af700f43edb6f5e6036 (diff) | |
download | vim-git-48f377a476e4a3312aa0e3535aba170484b59483.tar.gz |
patch 8.1.0613: when executing an insecure function the secure flag is stuckv8.1.0613
Problem: When executing an insecure function the secure flag is stuck.
(Gabriel Barta)
Solution: Restore "secure" instead of decrementing it. (closes #3705)
-rw-r--r-- | src/buffer.c | 3 | ||||
-rw-r--r-- | src/option.c | 19 | ||||
-rw-r--r-- | src/testdir/test_autocmd.vim | 22 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 34 insertions, 12 deletions
diff --git a/src/buffer.c b/src/buffer.c index bb940691c..66068d963 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -5519,6 +5519,7 @@ chk_modeline( if (*s != NUL) /* skip over an empty "::" */ { + int secure_save = secure; #ifdef FEAT_EVAL save_current_sctx = current_sctx; current_sctx.sc_sid = SID_MODELINE; @@ -5530,7 +5531,7 @@ chk_modeline( retval = do_set(s, OPT_MODELINE | OPT_LOCAL | flags); - --secure; + secure = secure_save; #ifdef FEAT_EVAL current_sctx = save_current_sctx; #endif diff --git a/src/option.c b/src/option.c index f8e91e45c..3ab355f6c 100644 --- a/src/option.c +++ b/src/option.c @@ -5214,7 +5214,7 @@ do_set( { 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 // modeline or in secure mode, then deal with side @@ -5227,21 +5227,18 @@ do_set( #endif || (opt_flags & OPT_MODELINE) || (!value_is_replaced && (*p & P_INSECURE))) - { - did_inc_secure = TRUE; ++secure; - } - // Handle side effects, and set the global value for - // ":set" on local options. Note: when setting 'syntax' - // or 'filetype' autocommands may be triggered that can - // cause havoc. - errmsg = did_set_string_option(opt_idx, (char_u **)varp, + // Handle side effects, and set the global value + // for ":set" on local options. Note: when setting + // 'syntax' or 'filetype' autocommands may be + // triggered that can cause havoc. + errmsg = did_set_string_option( + opt_idx, (char_u **)varp, new_value_alloced, oldval, errbuf, opt_flags, &value_checked); - if (did_inc_secure) - --secure; + secure = secure_saved; } #if defined(FEAT_EVAL) diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index b05b210c2..b839bbb47 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -650,6 +650,28 @@ func Test_OptionSet_diffmode_close() "delfunc! AutoCommandOptionSet 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. func Test_BufleaveWithDelete() new | edit Xfile1 diff --git a/src/version.c b/src/version.c index a605def47..c6d55d855 100644 --- a/src/version.c +++ b/src/version.c @@ -800,6 +800,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 613, +/**/ 612, /**/ 611, |