]> granicus.if.org Git - vim/commitdiff
patch 8.1.0177: defining function in sandbox is inconsistent v8.1.0177
authorBram Moolenaar <Bram@vim.org>
Tue, 10 Jul 2018 17:39:18 +0000 (19:39 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 10 Jul 2018 17:39:18 +0000 (19:39 +0200)
Problem:    Defining function in sandbox is inconsistent, cannot use :function
            but can define a lambda.
Solution:   Allow defining a function in the sandbox, but also use the sandbox
            when executing it. (closes #3182)

src/ex_cmds.h
src/userfunc.c
src/version.c

index 48b025315734263dcff3570657204a58d9d0ea50..045bfcb203cd11986fc3e88768143c2c4abfddd7 100644 (file)
@@ -584,7 +584,7 @@ EX(CMD_for,         "for",          ex_while,
                        EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
                        ADDR_LINES),
 EX(CMD_function,       "function",     ex_function,
-                       EXTRA|BANG|CMDWIN,
+                       EXTRA|BANG|SBOXOK|CMDWIN,
                        ADDR_LINES),
 EX(CMD_global,         "global",       ex_global,
                        RANGE|WHOLEFOLD|BANG|EXTRA|DFLALL|SBOXOK|CMDWIN,
index 71acaecc3a9373c581b04ef7ad3250f17d5190d9..80a603b16e53c3ac161316fedb347dc4d87f61fa 100644 (file)
 #include "vim.h"
 
 #if defined(FEAT_EVAL) || defined(PROTO)
-/* function flags */
-#define FC_ABORT    0x01       /* abort function on error */
-#define FC_RANGE    0x02       /* function accepts range */
-#define FC_DICT            0x04        /* Dict function, uses "self" */
-#define FC_CLOSURE  0x08       /* closure, uses outer scope variables */
-#define FC_DELETED  0x10       /* :delfunction used while uf_refcount > 0 */
-#define FC_REMOVED  0x20       /* function redefined while uf_refcount > 0 */
+// flags used in uf_flags
+#define FC_ABORT    0x01       // abort function on error
+#define FC_RANGE    0x02       // function accepts range
+#define FC_DICT            0x04        // Dict function, uses "self"
+#define FC_CLOSURE  0x08       // closure, uses outer scope variables
+#define FC_DELETED  0x10       // :delfunction used while uf_refcount > 0
+#define FC_REMOVED  0x20       // function redefined while uf_refcount > 0
+#define FC_SANDBOX  0x40       // function defined in the sandbox
 
 /* From user function to hashitem and back. */
 #define UF2HIKEY(fp) ((fp)->uf_name)
@@ -296,6 +297,8 @@ get_lambda_tv(char_u **arg, typval_T *rettv, int evaluate)
        if (prof_def_func())
            func_do_profile(fp);
 #endif
+       if (sandbox)
+           flags |= FC_SANDBOX;
        fp->uf_varargs = TRUE;
        fp->uf_flags = flags;
        fp->uf_calls = 0;
@@ -688,6 +691,7 @@ call_user_func(
     char_u     *save_sourcing_name;
     linenr_T   save_sourcing_lnum;
     scid_T     save_current_SID;
+    int                using_sandbox = FALSE;
     funccall_T *fc;
     int                save_did_emsg;
     static int depth = 0;
@@ -854,6 +858,13 @@ call_user_func(
     save_sourcing_name = sourcing_name;
     save_sourcing_lnum = sourcing_lnum;
     sourcing_lnum = 1;
+
+    if (fp->uf_flags & FC_SANDBOX)
+    {
+       using_sandbox = TRUE;
+       ++sandbox;
+    }
+
     /* need space for function name + ("function " + 3) or "[number]" */
     len = (save_sourcing_name == NULL ? 0 : STRLEN(save_sourcing_name))
                                                   + STRLEN(fp->uf_name) + 20;
@@ -1020,6 +1031,8 @@ call_user_func(
     if (do_profiling == PROF_YES)
        script_prof_restore(&wait_start);
 #endif
+    if (using_sandbox)
+       --sandbox;
 
     if (p_verbose >= 12 && sourcing_name != NULL)
     {
@@ -2429,6 +2442,8 @@ ex_function(exarg_T *eap)
        func_do_profile(fp);
 #endif
     fp->uf_varargs = varargs;
+    if (sandbox)
+       flags |= FC_SANDBOX;
     fp->uf_flags = flags;
     fp->uf_calls = 0;
     fp->uf_script_ID = current_SID;
index 982d1118787ab81b1e1aac88975d42abcd60c0d5..88d3b7e8b242ce5dab0769fddc3830d5940397f2 100644 (file)
@@ -789,6 +789,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    177,
 /**/
     176,
 /**/