From dfc26195c916d54163a3f0dd2eb159db2d974569 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Mon, 10 Jan 2011 18:24:17 +0000 Subject: 28617: NO_EXEC option was doing too much work in parameter subscripting, parameter assignment, and globbing --- ChangeLog | 8 +++++++- Src/glob.c | 2 +- Src/params.c | 18 ++++++++++++++++++ Test/E01options.ztst | 9 +++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index f76633ac6..6cb83facb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-01-10 Peter Stephenson + + * 28617: Src/glob.c, Src/params.c, Test/E01options.ztst: NO_EXEC + option was doing to much work with parameter subscripting, + parameter assignments, and globbing. + 2011-01-09 Peter Stephenson * 28544: Src/Makefile.in, Makemod.in.in: another way of handling @@ -14088,5 +14094,5 @@ ***************************************************** * This is used by the shell to define $ZSH_PATCHLEVEL -* $Revision: 1.5177 $ +* $Revision: 1.5178 $ ***************************************************** diff --git a/Src/glob.c b/Src/glob.c index 5f6813589..b788ff38a 100644 --- a/Src/glob.c +++ b/Src/glob.c @@ -1111,7 +1111,7 @@ zglob(LinkList list, LinkNode np, int nountok) struct globdata saved; /* saved glob state */ int nobareglob = !isset(BAREGLOBQUAL); - if (unset(GLOBOPT) || !haswilds(ostr)) { + if (unset(GLOBOPT) || !haswilds(ostr) || unset(EXECOPT)) { if (!nountok) untokenize(ostr); return; diff --git a/Src/params.c b/Src/params.c index 3eb83eab2..246b0c1e1 100644 --- a/Src/params.c +++ b/Src/params.c @@ -1055,6 +1055,14 @@ getarg(char **str, int *inv, Value v, int a2, zlong *w, zlong num = 1, beg = 0, r = 0, quote_arg = 0; Patprog pprog = NULL; + /* + * If in NO_EXEC mode, the parameters won't be set up + * properly, so there's no point even doing any sanity checking. + * Just return 0 now. + */ + if (unset(EXECOPT)) + return 0; + ishash = (v->pm && PM_TYPE(v->pm->node.flags) == PM_HASHED); if (prevcharlen) *prevcharlen = 1; @@ -2230,6 +2238,8 @@ export_param(Param pm) mod_export void setstrvalue(Value v, char *val) { + if (unset(EXECOPT)) + return; if (v->pm->node.flags & PM_READONLY) { zerr("read-only variable: %s", v->pm->node.nam); zsfree(val); @@ -2361,6 +2371,8 @@ setnumvalue(Value v, mnumber val) { char buf[BDIGBUFSIZE], *p; + if (unset(EXECOPT)) + return; if (v->pm->node.flags & PM_READONLY) { zerr("read-only variable: %s", v->pm->node.nam); return; @@ -2398,6 +2410,8 @@ setnumvalue(Value v, mnumber val) mod_export void setarrvalue(Value v, char **val) { + if (unset(EXECOPT)) + return; if (v->pm->node.flags & PM_READONLY) { zerr("read-only variable: %s", v->pm->node.nam); freearray(val); @@ -2808,6 +2822,8 @@ sethparam(char *s, char **val) errflag = 1; return NULL; } + if (unset(EXECOPT)) + return; queue_signals(); if (!(v = fetchvalue(&vbuf, &s, 1, SCANPM_ASSIGNING))) createparam(t, PM_HASHED); @@ -2846,6 +2862,8 @@ setnparam(char *s, mnumber val) errflag = 1; return NULL; } + if (unset(EXECOPT)) + return; queue_signals(); ss = strchr(s, '['); v = getvalue(&vbuf, &s, 1); diff --git a/Test/E01options.ztst b/Test/E01options.ztst index be83ceccd..4b53840c6 100644 --- a/Test/E01options.ztst +++ b/Test/E01options.ztst @@ -344,6 +344,15 @@ 0:NO_EXEC option >before + (setopt noexec + typeset -A hash + hash['this is a string']) +0:NO_EXEC option should not attempt to parse subscripts + + (setopt noexec nomatch + echo *NonExistentFile*) +0:NO_EXEC option should not do globbing + setopt NO_eval_lineno eval 'print $LINENO' setopt eval_lineno -- cgit 1.4.1