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:
parent
cf2e6a27d5
commit
1a89fbabb4
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
19
Src/params.c
19
Src/params.c
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue