]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.2.0381: Vim9: Missing check_secure() in exec_instructions() v9.2.0381
authorChristian Brabandt <cb@256bit.org>
Mon, 20 Apr 2026 17:44:45 +0000 (17:44 +0000)
committerChristian Brabandt <cb@256bit.org>
Mon, 20 Apr 2026 17:44:45 +0000 (17:44 +0000)
Problem:  Vim9: Missing check_secure() when executing ISN_STOREENV
          instruction (Andrej TomĨi)
Solution: Add check_secure(), add test.

closes: #19992

Signed-off-by: Christian Brabandt <cb@256bit.org>
src/testdir/test_restricted.vim
src/version.c
src/vim9execute.c

index 2d8c8ce5f73db5e798678de6a7e945b053f914a3..d9810826a0bef10cdc6ae10fd2bf795416c88da0 100644 (file)
@@ -220,4 +220,49 @@ func Test_restricted_cscope()
   call delete('XResult_cscope')
 endfunc
 
+func Test_vim9_storeenv_sandbox()
+  let lines =<< trim END
+    vim9script
+
+    function g:LegacySetEnv()
+      let $VIM_SANDBOX_TEST = 'legacy'
+    endfunc
+
+    def Vim9SetEnv()
+      $VIM_SANDBOX_TEST = 'vim9_bypass'
+    enddef
+
+    # Legacy path should be blocked by check_secure()
+    var legacy_blocked = false
+    try
+      legacy sandbox call LegacySetEnv()
+    catch /E48/
+      legacy_blocked = true
+    endtry
+    assert_true(legacy_blocked, 'legacy $ENV assignment should be blocked in sandbox')
+    assert_false(exists('$VIM_SANDBOX_TEST'))
+
+    # Vim9 path should also be blocked by check_secure()
+    var vim9_blocked = false
+    try
+      sandbox Vim9SetEnv()
+    catch /E48/
+      vim9_blocked = true
+    endtry
+    assert_true(vim9_blocked, 'Vim9 ISN_STOREENV should be blocked in sandbox')
+    assert_false(exists('$VIM_SANDBOX_TEST'))
+    writefile([
+    legacy_blocked,
+    vim9_blocked,
+    string(v:errors)], 'XResult_storeenv')
+    qa
+  END
+  call writefile(lines, 'Xtest_storeenv_sandbox.vim', 'D')
+  let expected = ['true', 'true', '[]']
+  if RunVim([], [], '-u NONE -N -i NONE --not-a-term -S Xtest_storeenv_sandbox.vim')
+    call assert_equal(expected, readfile('XResult_storeenv'))
+  endif
+  call delete('XResult_storeenv')
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index ddac9aa6da3d6fe929a77872649b1b397657d53c..eaaa793d8bbf056770e833d08e9429464684cd9b 100644 (file)
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    381,
 /**/
     380,
 /**/
index 1bc25ed98e03f33de961472d94194570d4e5b401..d83b7968b2619218115604b75e51e7a2052d2195 100644 (file)
@@ -4472,7 +4472,7 @@ exec_instructions(ectx_T *ectx)
 
            // store $ENV
            case ISN_STOREENV:
-               if (check_restricted())
+               if (check_secure() || check_restricted())
                    goto theend;
                --ectx->ec_stack.ga_len;
                tv = STACK_TV_BOT(0);