about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--Src/params.c11
-rw-r--r--Test/K01nameref.ztst4
3 files changed, 15 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 0cc33c7f1..6dc453f7f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2023-02-12  Bart Schaefer  <schaefer@zsh.org>
 
+	* 51417: Src/params.c, Test/K01nameref.ztst: Check subscripts
+	in named reference values more rigorously.
+
 	* 51403: Doc/Zsh/builtins.yo, Doc/Zsh/expn.yo, Doc/Zsh/func.yo,
 	Doc/Zsh/grammar.yo, Doc/Zsh/params.yo, Test/K01nameref.ztst:
 	Tests and documentation for 51402, clean up some other tests.
diff --git a/Src/params.c b/Src/params.c
index 4910d65fe..f61374b87 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -6281,7 +6281,16 @@ valid_refname(char *val)
     if (*t != 0) {
 	if (*t == '[') {
 	    tokenize(t = dupstring(t+1));
-	    t = parse_subscript(t, 0, ']');
+	    while ((t = parse_subscript(t, 0, ']')) && *t++ == Outbrack) {
+		if (*t == Inbrack)
+		    ++t;
+		else
+		    break;
+	    }
+	    if (t && *t) {
+		/* zwarn("%s: stuff after subscript: %s", val, t); */
+		t = NULL;
+	    }
 	} else if (t[1] || !(*t == '!' || *t == '?' ||
 			     *t == '$' || *t == '-' ||
 			     *t == '0' || *t == '_')) {
diff --git a/Test/K01nameref.ztst b/Test/K01nameref.ztst
index 61c2b006a..d2abdd391 100644
--- a/Test/K01nameref.ztst
+++ b/Test/K01nameref.ztst
@@ -350,9 +350,9 @@ F:ksh93 does not implement this either
 >typeset -A hash=( [y]=HIT )
 
  unset -n ptr1
- typeset -n ptr1='not good'
+ typeset -n ptr1='not[2]good'
 1:invalid nameref
-*?*invalid variable name: not good
+*?*invalid variable name: not\[2\]good
 
  unset -n ptr1
  unset hash