summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilippe Altherr <philippe.altherr@gmail.com>2026-06-22 21:00:05 -0700
committerBart Schaefer <schaefer@zsh.org>2026-06-22 21:29:59 -0700
commit8a0801b83b1d8a44c021e6799b99c80d068324ad (patch)
tree215e77294a49c1d37357a773da6f0a33ae002628
parentunposted: git ignore .DS_Store (diff)
downloadzsh-8a0801b83b1d8a44c021e6799b99c80d068324ad.tar
zsh-8a0801b83b1d8a44c021e6799b99c80d068324ad.tar.gz
zsh-8a0801b83b1d8a44c021e6799b99c80d068324ad.tar.bz2
zsh-8a0801b83b1d8a44c021e6799b99c80d068324ad.tar.lz
zsh-8a0801b83b1d8a44c021e6799b99c80d068324ad.tar.xz
zsh-8a0801b83b1d8a44c021e6799b99c80d068324ad.tar.zst
zsh-8a0801b83b1d8a44c021e6799b99c80d068324ad.zip
54792: prevent named references from being entered as named directories
-rw-r--r--Src/params.c5
-rw-r--r--Test/K01nameref.ztst30
2 files changed, 33 insertions, 2 deletions
diff --git a/Src/params.c b/Src/params.c
index c361527be..e111b28c7 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -3975,7 +3975,7 @@ floatsetfn(Param pm, double x)
pm->u.dval = x;
}
-/* Function to get value of a scalar (string) parameter */
+/* Function to get value of a scalar (string) or nameref parameter */
/**/
mod_export char *
@@ -3984,7 +3984,7 @@ strgetfn(Param pm)
return pm->u.str ? pm->u.str : (char *) hcalloc(1);
}
-/* Function to set value of a scalar (string) parameter */
+/* Function to set value of a scalar (string) or nameref parameter */
/**/
mod_export void
@@ -3995,6 +3995,7 @@ strsetfn(Param pm, char *x)
pm->u.str = x;
}
if (!(pm->node.flags & PM_HASHELEM) && !pm->level &&
+ (PM_TYPE(pm->node.flags) == PM_SCALAR) &&
((pm->node.flags & PM_NAMEDDIR) || isset(AUTONAMEDIRS))) {
pm->node.flags |= PM_NAMEDDIR;
adduserdir(pm->node.nam, x, 0, 0);
diff --git a/Test/K01nameref.ztst b/Test/K01nameref.ztst
index 65386d6a4..97edb1bde 100644
--- a/Test/K01nameref.ztst
+++ b/Test/K01nameref.ztst
@@ -1575,6 +1575,36 @@ F:previously this could create an infinite recursion and crash
>typeset PS1=zz
*?*
+# Testing named directories requires to run in interactive mode
+
+ PS1= $ZTST_testdir/../Src/zsh -fis <<<'
+ typeset v1=/1 v2
+ typeset -n r1=v1 r2
+ { echo "~v1:" ~v1 } 2>&1
+ { echo "~r1:" ~r1 } 2>&1
+ echo "nameddirs=( ${(kv)nameddirs} )"
+ r1=/A
+ echo "nameddirs=( ${(kv)nameddirs} )"
+ hash -d v2=/2 r2=/R
+ echo "nameddirs=( ${(kv)nameddirs} )"
+ setopt autonamedirs
+ v2=V2
+ echo "nameddirs=( ${(kv)nameddirs} )"
+ r2=v2
+ echo "nameddirs=( ${(kv)nameddirs} )"
+ r2=/B
+ echo "nameddirs=( ${(kv)nameddirs} )"
+ '
+0:Only string parameters are promoted to named directories
+>~v1: /1
+>zsh: no such user or named directory: r1
+>nameddirs=( v1 /1 )
+>nameddirs=( v1 /A )
+>nameddirs=( v1 /A v2 /2 r2 /R )
+>nameddirs=( v1 /A r2 /R )
+>nameddirs=( v1 /A r2 /R )
+>nameddirs=( v1 /A v2 /B r2 /R )
+
unset var1 var2
typeset -n ref1=var1
() {