diff options
author | Bram Moolenaar <Bram@vim.org> | 2018-07-10 19:39:18 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2018-07-10 19:39:18 +0200 |
commit | 93343725b5fa1cf580a24302455980faacae8ee2 (patch) | |
tree | 0467626f476965cd0f6042fec8745f3910e42d9b /src | |
parent | 18085fae7482906f8e94ecc7386ecf6a02dc407d (diff) |
patch 8.1.0177: defining function in sandbox is inconsistentv8.1.0177
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)
Diffstat (limited to 'src')
-rw-r--r-- | src/ex_cmds.h | 2 | ||||
-rw-r--r-- | src/userfunc.c | 29 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 25 insertions, 8 deletions
diff --git a/src/ex_cmds.h b/src/ex_cmds.h index 48b0253157..045bfcb203 100644 --- a/src/ex_cmds.h +++ b/src/ex_cmds.h @@ -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, diff --git a/src/userfunc.c b/src/userfunc.c index 71acaecc3a..80a603b16e 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -14,13 +14,14 @@ #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; diff --git a/src/version.c b/src/version.c index 982d111878..88d3b7e8b2 100644 --- a/src/version.c +++ b/src/version.c @@ -790,6 +790,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 177, +/**/ 176, /**/ 175, |