[libvirt] PATCH: 19/25: Remove use of non-threadsafe POSIX apis

Daniel P. Berrange berrange at redhat.com
Fri Jan 16 12:25:02 UTC 2009


On Fri, Jan 16, 2009 at 12:21:59PM +0000, Richard W.M. Jones wrote:
> On Tue, Jan 13, 2009 at 05:46:37PM +0000, Daniel P. Berrange wrote:
> > +        char buf[1024];
> 
> sysconf (_SC_GETPW_R_SIZE_MAX)?
> 
> Looking at glibc's implementation of getpwuid (which uses getpwuid_r),
> I see that glibc dynamically reallocates the buffer as necessary to
> the correct size for the return value.  The logic of this is fairly
> simple so maybe we should do the same?
> 
> From glibc:
> 
>   buffer = malloc (/*some_initial_size*/);
> 
>   while (buffer != NULL
>          && (getpwuid_r (const char *name, &resbuf, buffer,
>                          buffer_size, &result)
>              == ERANGE))
>     {
>       char *new_buf;
>       buffer_size *= 2;
>       new_buf = (char *) realloc (buffer, buffer_size);
>       if (new_buf == NULL)
>         {
>           free (buffer);
>           errno = ENOMEM;
>         }
>       buffer = new_buf;
>     }
> 
> 
> Anyhow, +1 but I'd be happier if these functions were centralized in
> somewhere like src/utils.c.

That's a good idea - in all the cases where we currently use getpwuid
all we actually want is the home directory path. So we could add a
simple func:

   char *virUserHomeDirectory(uid_t uid);

and hide all the horrific code in there.

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list