Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH] Detect invalid variable names in reference initializers



The following patch is a slightly modified version of the last commit in Remove support for named references to subscripted variables (workers/54269). It detects invalid variable names in for loops whose loop variable is a reference, it fixes a typo in valid_refname, and it changes the error message to match the one from ksh.

Detect invalid variable names in reference initializers

Philippe

diff --git a/Src/params.c b/Src/params.c
index 461e02acf..c62a61829 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -3275,7 +3275,7 @@ assignsparam(char *s, char *val, int flags)
     }
     if (*val && (v->pm->node.flags & PM_NAMEREF)) {
 	if (!valid_refname(val, v->pm->node.flags)) {
-	    zerr("invalid name reference: %s", val);
+	    zerr("invalid variable name: %s", val);
 	    zsfree(val);
 	    unqueue_signals();
 	    errflag |= ERRFLAG_ERROR;
@@ -6386,6 +6386,10 @@ setloopvar(char *name, char *value)
 	  zerr("read-only reference: %s", pm->node.nam);
 	  return;
       }
+      if (!valid_refname(value, pm->node.flags)) {
+	  zerr("invalid variable name: %s", value);
+	  return;
+      }
       pm->base = pm->width = 0;
       SETREFNAME(pm, ztrdup(value));
       pm->node.flags &= ~PM_UNSET;
@@ -6524,5 +6528,5 @@ valid_refname(char *val, int flags)
 	    return 0;
 	}
     }
-    return !!t;
+    return !*t;
 }
diff --git a/Test/K01nameref.ztst b/Test/K01nameref.ztst
index 0b4475827..77a01ea48 100644
--- a/Test/K01nameref.ztst
+++ b/Test/K01nameref.ztst
@@ -603,7 +603,7 @@ F:ksh93 does not implement this either
  unset -n ptr1
  typeset -n ptr1='not[2]good'
 1:invalid nameref
-*?*invalid name reference: not\[2\]good
+*?*invalid variable name: not\[2\]good
 
  unset -n ptr1
  unset hash
@@ -1053,6 +1053,19 @@ F:Checking for a bug in zmodload that affects later tests
 >
 *?*reference ref*to local variable one
 
+ typeset -n ref=var
+ {
+   for ref in valid1 inv@lid valid2; do typeset -p ref; done
+ } always { TRY_BLOCK_ERROR=0 }
+ typeset -nr ref=var
+ {
+   for ref in valid3 valid4; do typeset -p ref; done
+ } always { TRY_BLOCK_ERROR=0 }
+1:for-loop variable is a reference, part 5, errors
+>typeset -n ref=valid1
+*?*invalid variable name: inv@lid
+*?*read-only reference: ref
+
  unset -n ref
  typeset -n ref
  () {
@@ -1391,20 +1404,20 @@ F:Subscripting on 1 01 ! ? - should print first character but do not
 >x
 >typeset -un x=_
 >x
-?edgeupper: invalid name reference: argv
-?edgeupper: invalid name reference: ARGC
-?edgelocal: invalid name reference: @
-?edgelocal: invalid name reference: @[1]
-?edgeupper: invalid name reference: @
-?edgelocal: invalid name reference: *
-?edgelocal: invalid name reference: *[1]
-?edgeupper: invalid name reference: *
-?edgelocal: invalid name reference: #
-?edgelocal: invalid name reference: #[1]
-?edgeupper: invalid name reference: #
-?edgeupper: invalid name reference: 0
-?edgeupper: invalid name reference: 1
-?edgeupper: invalid name reference: 01
+?edgeupper: invalid variable name: argv
+?edgeupper: invalid variable name: ARGC
+?edgelocal: invalid variable name: @
+?edgelocal: invalid variable name: @[1]
+?edgeupper: invalid variable name: @
+?edgelocal: invalid variable name: *
+?edgelocal: invalid variable name: *[1]
+?edgeupper: invalid variable name: *
+?edgelocal: invalid variable name: #
+?edgelocal: invalid variable name: #[1]
+?edgeupper: invalid variable name: #
+?edgeupper: invalid variable name: 0
+?edgeupper: invalid variable name: 1
+?edgeupper: invalid variable name: 01
 
  edgelocal \$
  edgelocal '$[1]'


Messages sorted by: Reverse Date, Date, Thread, Author