Index: Src/builtin.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/builtin.c,v retrieving revision 1.151 diff -u -p -r1.151 builtin.c --- Src/builtin.c 7 Nov 2005 09:37:34 -0000 1.151 +++ Src/builtin.c 4 Mar 2006 09:19:18 -0000 @@ -1920,24 +1920,17 @@ typeset_single(char *cname, char *pname, zerrnam(cname, "%s: restricted", pname, 0); return pm; } + pm->flags = (pm->flags | (on & ~PM_READONLY)) & ~(off | PM_UNSET); if ((on & PM_UNIQUE) && !(pm->flags & PM_READONLY & ~off)) { Param apm; - char **x; - if (PM_TYPE(pm->flags) == PM_ARRAY) { - x = (*pm->gsu.a->getfn)(pm); - uniqarray(x); - if (pm->ename && x) - arrfixenv(pm->ename, x); - } else if (PM_TYPE(pm->flags) == PM_SCALAR && pm->ename && - (apm = - (Param) paramtab->getnode(paramtab, pm->ename))) { - x = (*apm->gsu.a->getfn)(apm); - uniqarray(x); - if (x) - arrfixenv(pm->nam, x); - } + + if (PM_TYPE(pm->flags) == PM_ARRAY) + apm = pm; + else if (PM_TYPE(pm->flags) == PM_SCALAR && pm->ename) + apm = (Param) paramtab->getnode(paramtab, pm->ename); + if (apm) + apm->gsu.a->setfn(pm, apm->gsu.a->getfn(apm)); } - pm->flags = (pm->flags | (on & ~PM_READONLY)) & ~(off | PM_UNSET); if (on & (PM_LEFT | PM_RIGHT_B | PM_RIGHT_Z)) { if (typeset_setwidth(cname, pm, ops, on, 0)) return NULL; Index: Src/utils.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/utils.c,v retrieving revision 1.118 diff -u -p -r1.118 utils.c --- Src/utils.c 1 Mar 2006 14:50:52 -0000 1.118 +++ Src/utils.c 4 Mar 2006 09:19:21 -0000 @@ -2499,7 +2499,7 @@ freearray(char **s) while (*s) zsfree(*s++); - free(t); + zfree(t, 0); } /**/ Index: Src/Modules/parameter.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/Modules/parameter.c,v retrieving revision 1.35 diff -u -p -r1.35 parameter.c --- Src/Modules/parameter.c 10 Mar 2005 17:56:05 -0000 1.35 +++ Src/Modules/parameter.c 4 Mar 2006 09:19:21 -0000 @@ -929,15 +929,19 @@ scanpmmodules(UNUSED(HashTable ht), Scan /**/ static void -dirssetfn(UNUSED(Param pm), char **x) +dirssetfn(Param pm, char **x) { char **ox = x; if (!incleanup) { freelinklist(dirstack, freestr); dirstack = znewlinklist(); - while (x && *x) - zaddlinknode(dirstack, ztrdup(*x++)); + if (x) { + if (pm->flags & PM_UNIQUE) + uniqarray(x); + while (*x) + zaddlinknode(dirstack, ztrdup(*x++)); + } } if (ox) freearray(ox);