Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
[PATCH] Don't segfault when uniquifying hidden tied arrays
- X-seq: zsh-workers 55000
- From: Philippe Altherr <philippe.altherr@xxxxxxxxx>
- To: Zsh hackers list <zsh-workers@xxxxxxx>
- Subject: [PATCH] Don't segfault when uniquifying hidden tied arrays
- Date: Sun, 19 Jul 2026 15:17:36 +0200
- 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-20260327; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=C2mz5ghQ4ITdPuLmViLVCba+ihjoZEHHIjunuYcH72c=; fh=BgAYDYpL6Ne/A5nWEMVJiHiBtrz8Imz3uf26RDwgQX4=; b=hR90DEKB1SnOP7NrPRssN2phWSaoSd69roNK959xL36jjSHIzzZ3s52xHn9cLcgTAP VWuxszFsN2U1BgKriwmsHlWMl07FHxrzVdm5sVdjv4VPbSDSBYhQ+RkiNip83SDIIJZ0 DkMahe7eT95+sxOUpaANL7SK/fddSIJSLrBquVJzHhQgvGflBFG1xhMrwYCe9cV2bJRU NgViVp0RrN/76zcHBLFo6gXlsn8XI6W2WH4f6QhsAYaH8c2wKO+GCIFxkfQoPVpfHP7B SVc2hMToXYusau4Znp1KVyA6k8w2Fr+Zu8R0t4TsmHv3fMUU8PICXe3awdssIWJymo8I T9Zg==; darn=zsh.org
- Arc-seal: i=1; a=rsa-sha256; t=1784467068; cv=none; d=google.com; s=arc-20260327; b=m+TsZvsJqfmTQzDMDqEnnosSqV677OD4x+Dvurk5pBaeTSL2C1OLCFSYtnqSGd25If 5/UeK6JDh3lT8eFHUO83B0lE1uJEKXj3e8Mcolk5VI4rDLZY1joUIz2RPrZ/nb36M5AU SA+a/myuAchCOxpe3FUfsOUoOZbEwiw16Z5lGeeHUWyPyhZ2p7/WNAeP/fr68eU85hEB Wa6BOrtqPygzXrBaQon0NrSLs6nXxnpH3lR30+P1d3PXLUoCWqCvK4yKUWDWs7ppf6rb aPKQj9PKOSH4+gc7zNuTT1YP2dVuegI8EjGsBN+d+hg063tPYXJLBD+8T9bF09iZNH5x jEqQ==
- Archived-at: <https://zsh.org/workers/55000>
- List-id: <zsh-workers.zsh.org>
The following code snippet triggers a segmentation fault:
zsh -c 'typeset -T VAR var; () { typeset -i var=1; typeset -g -U VAR }'
zsh: segmentation fault
Philippe
diff --git a/Src/builtin.c b/Src/builtin.c
index 7a19c051a..870c4a63c 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -2252,7 +2252,6 @@ typeset_single(char *cname, char *pname, Param pm, int func,
return NULL;
}
if ((on & PM_UNIQUE) && !(pm->node.flags & PM_READONLY & ~off)) {
- Param apm;
char **x;
if (PM_TYPE(pm->node.flags) == PM_ARRAY) {
x = (*pm->gsu.a->getfn)(pm);
@@ -2263,10 +2262,10 @@ typeset_single(char *cname, char *pname, Param pm, int func,
(*pm->gsu.a->setfn)(pm, x);
} else if (pm->ename && x)
arrfixenv(NULL, pm, x);
- } else if (PM_TYPE(pm->node.flags) == PM_SCALAR && pm->ename &&
- (apm =
- (Param) paramtab->getnode(paramtab, pm->ename))) {
- x = (*apm->gsu.a->getfn)(apm);
+ } else if (PM_TYPE(pm->node.flags) == PM_SCALAR && pm->ename) {
+ x = *(pm->node.flags & PM_SPECIAL
+ ? (char ***)pm->u.data
+ : ((struct tieddata *)pm->u.data)->arrptr);
uniqarray(x);
if (x)
arrfixenv(pm, NULL, x);
diff --git a/Test/B02typeset.ztst b/Test/B02typeset.ztst
index 32e79ced2..7fd945412 100644
--- a/Test/B02typeset.ztst
+++ b/Test/B02typeset.ztst
@@ -301,6 +301,20 @@
>local unique tied array SCALAR
>array local tied SCALAR array
+ typeset -T VAR var=(a b c b a)
+ () {
+ typeset -i var=1
+ typeset -g -U VAR
+ typeset -p VAR var
+ }
+ typeset -p VAR var
+0:Regression test for not segfaulting when uniquifying a hidden tied array
+F:BUG:The inner "typeset -p VAR" should contain the value of the outer "var"
+>typeset -g -UT VAR var=1
+>typeset -i var=1
+>typeset -UT VAR var=( a b c )
+>typeset -aT VAR var=( a b c )
+
typeset -T SCALAR array
typeset +T SCALAR
1:Untying is prohibited
Messages sorted by:
Reverse Date,
Date,
Thread,
Author