1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-05-31 20:36:03 +02:00

19361: Memory leaks

This commit is contained in:
Peter Stephenson 2004-01-12 12:09:10 +00:00
parent cf2e6a27d5
commit 1a89fbabb4
3 changed files with 31 additions and 4 deletions

View File

@ -1,3 +1,11 @@
2004-01-12 Peter Stephenson <pws@csr.com>
* 19361: Src/builtin.c, Src/params.c: Memory leaks possibly
indicated by valgrind. Retying a pair of variables leaked
a string. Attempting to assign to a slice of an associative
array (error) could leak the value. Unsetting the array part
of a user tied array leaked a couple of bytes.
2004-01-09 Peter Stephenson <pws@csr.com>
* 19354: Doc/Zsh/compctl.yo, Doc/Zsh/intro.yo: Fix section

View File

@ -2255,7 +2255,15 @@ bin_typeset(char *name, char **argv, Options ops, int func)
return 1;
}
/*
* pm->ename is only deleted when the struct is, so
* we need to free it here if it already exists.
*/
if (pm->ename)
zsfree(pm->ename);
pm->ename = ztrdup(asg->name);
if (apm->ename)
zsfree(apm->ename);
apm->ename = ztrdup(asg0.name);
if (oldval)
setsparam(asg0.name, oldval);

View File

@ -1599,6 +1599,7 @@ setstrvalue(Value v, char *val)
}
if (v->pm->flags & PM_HASHED) {
zerr("%s: attempt to set slice of associative array", v->pm->nam, 0);
zsfree(val);
return;
}
v->pm->flags &= ~PM_UNSET;
@ -2377,12 +2378,12 @@ strsetfn(Param pm, char *x)
/* Function to get value of an array parameter */
static char *nullarray = NULL;
/**/
char **
arrgetfn(Param pm)
{
static char *nullarray = NULL;
return pm->u.arr ? pm->u.arr : &nullarray;
}
@ -2558,7 +2559,9 @@ strvargetfn(Param pm)
mod_export char **
arrvargetfn(Param pm)
{
return *((char ***)pm->u.data);
char **arrptr = *((char ***)pm->u.data);
return arrptr ? arrptr : &nullarray;
}
/* Function to set value of generic special array parameter. *
@ -2577,7 +2580,15 @@ arrvarsetfn(Param pm, char **x)
freearray(*dptr);
if (pm->flags & PM_UNIQUE)
uniqarray(x);
*dptr = x ? x : mkarray(NULL);
/*
* Special tied arrays point to variables accessible in other
* ways which need to be set to NULL. We can't do this
* with user tied variables since we can leak memory.
*/
if ((pm->flags & PM_SPECIAL) & !x)
*dptr = mkarray(NULL);
else
*dptr = x;
if (pm->ename && x)
arrfixenv(pm->ename, x);
}