summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBart Schaefer <schaefer@zsh.org>2023-02-12 12:20:33 -0800
committerBart Schaefer <schaefer@zsh.org>2023-02-12 12:20:33 -0800
commitf4c706f0c84bddb7777d38635c4ba1d43703e2e5 (patch)
treed9257451957349bf42277b3d355fb04ccb785ff8
parentacb15e3cc9af6c5b51e570765e6734e958d32aef (diff)
downloadzsh-f4c706f0c84bddb7777d38635c4ba1d43703e2e5.tar.gz
zsh-f4c706f0c84bddb7777d38635c4ba1d43703e2e5.zip
51417: Check subscripts in named reference values more rigorously.
-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