mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	19361: Memory leaks
This commit is contained in:
		
							parent
							
								
									cf2e6a27d5
								
							
						
					
					
						commit
						1a89fbabb4
					
				
					 3 changed files with 31 additions and 4 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue