summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilippe Altherr <philippe.altherr@gmail.com>2025-10-26 17:21:15 -0700
committerBart Schaefer <schaefer@zsh.org>2025-10-26 17:21:15 -0700
commit938b3c9475a98e5e22d7d1c6acabdaf0c8baf43f (patch)
tree809ed06e14ad4b255a0be22e1cdaa5d2ffd348fe
parent53797: fix creation of undeclared target variable through reference chain (diff)
downloadzsh-938b3c9475a98e5e22d7d1c6acabdaf0c8baf43f.tar
zsh-938b3c9475a98e5e22d7d1c6acabdaf0c8baf43f.tar.gz
zsh-938b3c9475a98e5e22d7d1c6acabdaf0c8baf43f.tar.bz2
zsh-938b3c9475a98e5e22d7d1c6acabdaf0c8baf43f.tar.lz
zsh-938b3c9475a98e5e22d7d1c6acabdaf0c8baf43f.tar.xz
zsh-938b3c9475a98e5e22d7d1c6acabdaf0c8baf43f.tar.zst
zsh-938b3c9475a98e5e22d7d1c6acabdaf0c8baf43f.zip
53790: corrections to reference loop detection
-rw-r--r--ChangeLog3
-rw-r--r--Src/builtin.c6
-rw-r--r--Test/K01nameref.ztst19
-rw-r--r--Test/V10private.ztst23
4 files changed, 38 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 1c93d9fce..ee7799f72 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -17,6 +17,9 @@
* Philippe: 53797: Src/params.c, Test/K01nameref.ztst: fix creation
of undeclared target variable through reference chain
+ * Philippe: 53790: Src/builtin.c, Test/K01nameref.ztst,
+ Test/V10private.ztst: corrections to reference loop detection
+
2025-10-24 Oliver Kiddle <opk@zsh.org>
* 54002: Src/parse.c: silence compiler warning for static function
diff --git a/Src/builtin.c b/Src/builtin.c
index 5563bdba9..5dd4fee01 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -3129,16 +3129,12 @@ bin_typeset(char *name, char **argv, LinkList assigns, Options ops, int func)
if (on & PM_NAMEREF) {
if (asg->value.scalar &&
- ((pm = (Param)resolve_nameref((Param)hn, asg)) &&
+ ((pm = (Param)paramtab->getnode(paramtab, asg->value.scalar)) &&
(pm->node.flags & PM_NAMEREF))) {
if (pm->node.flags & PM_SPECIAL) {
zwarnnam(name, "%s: invalid reference", pm->node.nam);
returnval = 1;
continue;
- } else if (pm->u.str && strcmp(pm->u.str, asg->name) == 0) {
- zwarnnam(name, "%s: invalid self reference", asg->name);
- returnval = 1;
- continue;
}
}
if (hn) {
diff --git a/Test/K01nameref.ztst b/Test/K01nameref.ztst
index 1a41c4756..bc9054093 100644
--- a/Test/K01nameref.ztst
+++ b/Test/K01nameref.ztst
@@ -450,6 +450,25 @@ F:unexpected side-effects of previous tests
1:looping assignment not allowed
*?*invalid self reference
+ typeset ptr1=not-a-ref
+ () {
+ typeset -n ptr1=ptr1
+ () {
+ typeset -n ptr1=ptr1
+ echo $ptr1
+ }
+ }
+0:regression: not a self reference (test 1)
+>not-a-ref
+
+ typeset -n ptr1
+ typeset -n ptr2=ptr1
+ () {
+ typeset ptr2=no-a-ref
+ typeset -n ptr1=ptr2
+ }
+0:regression: not a self reference (test 2)
+
unset -n ptr2
typeset -n ptr2='path[2]'
print -r -- $ptr2
diff --git a/Test/V10private.ztst b/Test/V10private.ztst
index 26004a2dc..4abbbf5c9 100644
--- a/Test/V10private.ztst
+++ b/Test/V10private.ztst
@@ -429,14 +429,7 @@ F:Here ptr1 points to global ptr2 so assignment succeeds
setopt localoptions errreturn
private -n ptr2
typeset -n ptr1=ptr2
- typeset -p ptr1 ptr2
- typeset val=LOCAL
- () {
- ptr1=val
- typeset -n
- printf "v %s=%s\n" ptr1 "$ptr1" ptr2 "$ptr2"
- }
- typeset -p ptr1 ptr2
+ echo NOT REACHED
}
typeset -p ptr1 ptr2
1:up-reference for private namerefs, end is in scope but private
@@ -446,6 +439,20 @@ F:Should we allow "public" namerefs to private parameters?
*?*no such variable: ptr2
() {
+ typeset ptr2=foo
+ typeset -n ptr1=ptr2
+ () {
+ setopt localoptions errreturn
+ private -n ptr2
+ typeset -n ptr1=ptr2
+ echo NOT REACHED
+ }
+ }
+1:regression test for invalid reference detection
+F:Should we allow "public" namerefs to private parameters?
+*?*ptr2: invalid reference
+
+ () {
private x=1
unset x
x=2