Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH] Don't segfault when uniquifying hidden tied arrays



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

Don't segfault when uniquifying hidden tied arrays

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