Subject: Re: calloc() and free() ps doesn'r report memory being freed, why?
To: John Maier <JohnAM@datastorm.com>
From: Elmar Kolkman <kolkmae@la1.apd.dec.com>
List: netbsd-users
Date: 04/23/1997 21:09:30
Hi,

> I have been hacking on ftpd so I can add an alternate ftp password   
> filelist.  This allows me to give explicit access to individule without   
> compromising system security.  Also I can allow others to administer the   
> auxiliary ftp passwords with out having to give them su privlages.
> 
> I added a feature to allow the sub-administrator the ability to limit   
> logins to a particular number of logins (3 in my case).  To do this I   
> added a function that is called after a correct password has been   
> entered.  I noticed, however, that the ftpd proccess memory usage went   
> through the cealing!  On a 64Meg machine, which I have never seen in   
> swap, I now get up to 14Megs into swap.
> 
> I am using free() like a good boy, by ps -maux shows VSZ=2264 and   
> RSS=2052.  On a anonymous FTP login (which by-passes this function) The   
> memory usage, as reported by ps, is VSZ=196 and RSS=520.
> 
> So what am I doing wrong?  Do I need to worry about this?  Is there   
> something I can do to get the OS to compact the memory for a proccess?
> 
> Thanks
> jam

Well, I have followed this discussion with interest. But, I don't think it
this case has anything to do with NetBSD.
See the code:

> 
> 
> /* code fragment */
> int ReduceLogin(char *szUser)
> {
>  unsigned int iCnt=0;
>  int iState=0;
>  passwdfile *password[NUMBER_OF_ENTRIES];

So, it's a array of NUMBER_OF_ENTRIES elements, namely pointers to passwdfile
types.

> 
>  *password = calloc(NUMBER_OF_ENTRIES, sizeof(passwdfile));

Hey, you're allocating the first entry in the table with another (through
calloc) table of NUMBER_OF_ENTRIES passwdfile types.
>  
>  /* manipulate data */
>  ~
>  ~
>  ~
>  ~
>  /* end data manipulation */
> 
>  free(*password); /* added out of desparation */

You're freeing your calloced table. This seems right.

>  free(password);  /* free the gobs (1.5 Meg) of memory allocated */

Hey. RING THE BELL. You're freeing your array from your function header. This
cannot be true....

>  return iState;
> }

There are two problems/solutions.
What I would do:

	/* code fragment */
	int ReduceLogin(char *szUser)
	{
	   unsigned int iCnt=0;
	   int iState=0;
	   passwdfile *password;

	   password = calloc(NUMBER_OF_ENTRIES, sizeof(passwdfile));

	   /* manipulate data */
	   ~
	   ~
	   ~
	   ~
	   /* end data manipulation */
	
	   free(password);  /* free the gobs (1.5 Meg) of memory allocated */

	   return iState;
	}

When I look at the comment you added in the code, I think that is your
solution.

BTW.: this doesn't solve the related problems which are discussed in this
      thread about process memory.


						Elmar

-- 
+--------------------------------+---------------------------------------------+
| If brevity is the soul of wit  |  kolkmae@apd.dec.com / elmar@usn.nl         |
| Length must be the body of it  |  Elmar Kolkman     In weekend : 071-5891734 |
|                    John O'Mill |  Tel. 055-5432104. After 20.00: 055-5785293 |
+--------------------------------+---------------------------------------------+