diff options
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | Src/params.c | 11 | ||||
-rw-r--r-- | Test/K01nameref.ztst | 4 |
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 |