]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.2.0341: some functions can be run from the sandbox v9.2.0341
authorq1uf3ng <q1uf3ng@protone.me>
Tue, 14 Apr 2026 15:58:40 +0000 (15:58 +0000)
committerChristian Brabandt <cb@256bit.org>
Tue, 14 Apr 2026 15:58:40 +0000 (15:58 +0000)
Problem:  some functions can be run from the sandbox
Solution: Block them, so they are not accessible from a modeline
          (q1uf3ng)

closes: #19975

Co-authored-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: q1uf3ng <q1uf3ng@protone.me>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/evalfunc.c
src/ex_cmds.h
src/filepath.c
src/testdir/test_excmd.vim
src/version.c

index f61135f77c7383c2f097aaa2db25f993311eafd3..a0fb99b738fa856c1ea8e1f1ec20f294d7fcd41d 100644 (file)
@@ -4391,6 +4391,9 @@ f_echoraw(typval_T *argvars, typval_T *rettv UNUSED)
 {
     char_u *str;
 
+    if (check_secure())
+       return;
+
     if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
        return;
 
index 7613d18aa15b9cb440a3e0550140dccd1d77634f..162156973260f7ebb8d71fc0cf93eb77b61800c7 100644 (file)
@@ -552,7 +552,7 @@ EXCMD(CMD_echomsg,  "echomsg",      ex_execute,
        EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
        ADDR_NONE),
 EXCMD(CMD_echoconsole, "echoconsole",  ex_execute,
-       EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_CMDWIN|EX_LOCK_OK,
        ADDR_NONE),
 EXCMD(CMD_echon,       "echon",        ex_echo,
        EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
index 721dbc05d73d7d5bb0d253d8f24839d1e882898d..492e0ad3ad72a764128512de2daf7f9ccbc019f2 100644 (file)
@@ -823,6 +823,9 @@ f_chdir(typval_T *argvars, typval_T *rettv)
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = NULL;
 
+    if (check_secure())
+       return;
+
     if (argvars[0].v_type != VAR_STRING)
     {
        // Returning an empty string means it failed.
@@ -1727,6 +1730,8 @@ f_readdir(typval_T *argvars, typval_T *rettv)
 
     if (rettv_list_alloc(rettv) == FAIL)
        return;
+    if (check_secure())
+       return;
 
     if (in_vim9script()
            && (check_for_string_arg(argvars, 0) == FAIL
@@ -1780,6 +1785,8 @@ f_readdirex(typval_T *argvars, typval_T *rettv)
 
     if (rettv_list_alloc(rettv) == FAIL)
        return;
+    if (check_secure())
+       return;
 
     if (in_vim9script()
            && (check_for_string_arg(argvars, 0) == FAIL
@@ -2051,6 +2058,9 @@ read_file_or_blob(typval_T *argvars, typval_T *rettv, int always_blob)
     void
 f_readblob(typval_T *argvars, typval_T *rettv)
 {
+    if (check_secure())
+       return;
+
     if (in_vim9script()
            && (check_for_string_arg(argvars, 0) == FAIL
                || check_for_opt_number_arg(argvars, 1) == FAIL
@@ -2067,6 +2077,9 @@ f_readblob(typval_T *argvars, typval_T *rettv)
     void
 f_readfile(typval_T *argvars, typval_T *rettv)
 {
+    if (check_secure())
+       return;
+
     if (in_vim9script()
            && (check_for_nonempty_string_arg(argvars, 0) == FAIL
                || check_for_opt_string_arg(argvars, 1) == FAIL
index c671adfe9477df8bbc2cc5f1c2910c40fc594c9c..cc877ce8b6cf1592ddac49ac424019450cd9fc37 100644 (file)
@@ -673,6 +673,13 @@ func Sandbox_tests()
   if has('unix')
     call assert_fails('cd `pwd`', 'E48:')
   endif
+  call assert_fails("call echoraw('test')", 'E48:')
+  call assert_fails("echoconsole 'test'", 'E48:')
+  call assert_fails("call readfile('Xsomefile')", 'E48:')
+  call assert_fails("call readblob('Xsomefile')", 'E48:')
+  call assert_fails("call readdir('.')", 'E48:')
+  call assert_fails("call readdirex('.')", 'E48:')
+  call assert_fails("call chdir('.')", 'E48:')
   " some options cannot be changed in a sandbox
   call assert_fails('set exrc', 'E48:')
   call assert_fails('set cdpath', 'E48:')
index 560233fafc0154f5901e324156960c59f40a7533..ff43fbef01eaa6e175336ab1c07c965569e1fe1e 100644 (file)
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    341,
 /**/
     340,
 /**/