_SC_GETPW_R_SIZE_MAX undefined in sysconf.c, what is correct value?

Dan Nelson dnelson at allantgroup.com
Mon Oct 24 00:10:39 UTC 2011


In the last episode (Oct 23), Christopher J. Ruwe said:
> I need to get the maximum size of an pwd-entry to determine the correct
> buffersize for calling getpwnam_r("uname",&pwd, buf, bufsize, &pwdp).  I
> would like to use sysconf(_SC_GETPW_R_SIZE_MAX) to determine bufsize,
> which unfornutately fails (returns -1).  Currently, I used 16384, which
> seems to be too much, bit works for the time being.
> 
> From recent mails I get that _SC_GETPW_R_SIZE_MAX is not available on
> FreeBSD, e.g.,
> http://lists.freebsd.org/pipermail/freebsd-ports-bugs/2009-September/173081.html
> and http://www.redhat.com/archives/libvir-list/2011-May/msg01013.html. 
> This assertion seems to be backed by /usr/srclib/libc/gen/sysconf.c, line
> 374.
> 
> From Stevens & Rago, Adavanced Programming in the UNIX Environment, I can
> get that FreeBSD supports all possible members in the passwd structure,
> but where can I determine the maximum size of these so that I can
> calculate the ax size of the pwd struct therefrom?  Does anybody know or
> know where to look what maximum size a pwd-entry can have?
> 
> Knowing the maximum size a pwd structure can have, it seems like to be an
> idea to define the correct value in sysconf.c.  As that is not done though
> suggested in the code, are there any obstacles in defining that value so
> nobody has done that so far?

>From looking at the libc/gen/getpwent.c file, it looks like a maximum size
might be 1MB.  The wrapper functions that convert getpw*_r functions into
ones that simply return a pointer to malloced data all use the getpw()
helper function, which starts with a 1k buffer and keeps doubling its size
until the data fits or it hits PWD_STORAGE_MAX (1MB).  PWD_STORAGE_MAX is
only checked within that getpw() function, though, so it's possible that an
nss library might return an even longer string to a get*_r call.  It's up to
you to decide what your own limit is :)

-- 
	Dan Nelson
	dnelson at allantgroup.com


More information about the freebsd-hackers mailing list