about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2011-01-10 18:24:17 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2011-01-10 18:24:17 +0000
commitdfc26195c916d54163a3f0dd2eb159db2d974569 (patch)
tree641d3f6854623e606edc8938ef296aade5c2b0e9
parentc34ad5cce2c4f222ebcaa14fb9bce68d49db1992 (diff)
downloadzsh-dfc26195c916d54163a3f0dd2eb159db2d974569.tar.gz
zsh-dfc26195c916d54163a3f0dd2eb159db2d974569.tar.xz
zsh-dfc26195c916d54163a3f0dd2eb159db2d974569.zip
28617: NO_EXEC option was doing too much work in
parameter subscripting, parameter assignment, and globbing
-rw-r--r--ChangeLog8
-rw-r--r--Src/glob.c2
-rw-r--r--Src/params.c18
-rw-r--r--Test/E01options.ztst9
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  <pws@csr.com>
+
+	* 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  <p.w.stephenson@ntlworld.com>
 
 	* 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