Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
[PATCH] Detect invalid variable names in reference initializers
- X-seq: zsh-workers 54278
- From: Philippe Altherr <philippe.altherr@xxxxxxxxx>
- To: Zsh hackers list <zsh-workers@xxxxxxx>
- Subject: [PATCH] Detect invalid variable names in reference initializers
- Date: Thu, 2 Apr 2026 23:36:04 +0100
- Arc-authentication-results: i=1; mx.google.com; arc=none
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=RTq6vcwK2YuYrfu30ybS4gy2D8NvIOyR0KoQf52lK8k=; fh=BgAYDYpL6Ne/A5nWEMVJiHiBtrz8Imz3uf26RDwgQX4=; b=KR7sXrv9JLX2ZaawbsZ+OX/FrnTE3X6i8GBTZdVepM2LWAtVpakw14C5jOjIHwpicB RdhJ9jFRkFSRIZUOfnU0Helbs9y5FqbMysDtC7LjXTFvthGhsNafrbRoHtYLELxk9N+L aTFS+onpzXN4jbEX0Bl7VyN1qRGmCzRoYCPOCkAlRxvIo48czL+0B3CNTB4eFev78kxK vOjUqbndecevbZHyZiBvejw59v34ZDoH99T7Zm5d2U5HakcRUd9d+XN8qqwbjisLvJNR Ecow8pLiGGztdZ2n5TKGZt3aQFCPnH9zgdM0aI5Kx8YXQGMY3rfaySlY9NsCh4PwBiY5 cARg==; darn=zsh.org
- Arc-seal: i=1; a=rsa-sha256; t=1775169376; cv=none; d=google.com; s=arc-20240605; b=GQwAdvuwE7aaQQBJJZhzpVyxNGt7DwKn/5fMbjQQMpBAc+n2G5857+EP0NSR33GouR N9Mw5jMfNExfnRMIXrOzPGO7snbA1imvCbrKQOAzw4q9xB0quKoeEKZgxBNsL7B3segw 1zOkhUHaWYgZGpWFe8AI2okSdI8J4ZqHIQb/6pUR6RHO/A3WuS/p9ehn9VGcbimYJhrJ CDpzwTKLVICML8OS3NrX9DT8MI9lkZZfHl4/KqtILjHsB1u4OZb+q+rb0nGzPSGggaiR XbAqfbl+mR2l4o28F1a9gHmAB01YsbuM9zpLXzGCFiTJKJ6Lj/bNrWas739FPvwNCT30 wWdQ==
- Archived-at: <https://zsh.org/workers/54278>
- List-id: <zsh-workers.zsh.org>
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