proper semantics for returning a character string?

Tito farmatito at tiscali.it
Thu Apr 20 19:57:01 UTC 2006


On Thursday 20 April 2006 21:29, you wrote:
> On Thu, 20 Apr 2006, Tito wrote:
> 
> > On Thursday 20 April 2006 17:47, Natanael Copa wrote:
> > > On Thu, 20 Apr 2006 10:15:44 -0400 (EDT)
> > > "Robert P. J. Day" <rpjday at mindspring.com> wrote:
> > >
> > > >
> > > >   a trivial question but what would be the proper way to implement a
> > > > routine that returns a character string consistent with busybox?
> > > >
> > > >   for example, let's say i wanted to write my routine:
> > > >
> > > >   char* map_uid_to_username(int uid)
> > > >
> > > > to return, of course, the username character string corresponding to
> > > > the UID.
> > > >
> > > >   obviously, i want that string to persist after the function call so
> > > > is the proper technique for that routine to determine the name, then
> > > > malloc() just enough space to hold a copy?
> > >
> > > What about:
> > >
> >
char *map_uid_to_username(int uid) {
  	struct passwd *pwd;
  	pwd = getpwuid(uid;
  	if (pwd) return pwd->pw_name;
 	bb_error_msg("uknown uid %d", uid);
  	return NULL;
}

    The return value may point to static area (when?), and may  be  overwritten  by
       subsequent calls to getpwent(), getpwnam(), or getpwuid().

So in this case no memory leak?

Tito
> 
> the library routine getpwuid() does not take a second parameter, so
> i'll just assume that's a typo.  the issue that was raised earlier,
> though, was that if you call that routine repeatedly, even for the
> same UID, you're going to slowly consume memory as every call to
> getpwuid() allocates space for a new "struct passwd", right?  and that
> seemed to be cause for concern.
> 
> however, if you think about doing the same thing with just regular
> calls to getpwuid() as you would on a non-BB system, you're going to
> have *exactly* the same problem, no?  so maybe it's not worth worrying
> about the memory leak if that's the normal behaviour in the first
> place.
> 
> the *other* option would be to implement map_uid_to_username() in
> terms of getpwuid_r() instead, which could avoid the memory leak
> issue, no?
> 
> rday
> 



More information about the busybox mailing list