implementation of getpwnam_r
David Leimbach
leimy2k at mac.com
Mon Mar 31 15:15:15 PST 2003
> On Sun, Mar 30, 2003 at 06:06:20PM -0600, David Leimbach wrote:
>
>> It seems this already exists in src/contrib/bind/lib/getpwent_r.c
>>
>> int getpwnam_r(const char * login, struct passwd *pwptr, char * buf,
>> size_t buflen,
>> struct passwd ** result)
>> {
>>
>> struct passwd *pw = getpwnam(login);
>> int res;
>>
>> if (pw == NULL) {
>> *result = NULL;
>> return (0);
>> }
>>
>> res = copy_passwd(pw,pwptr,buf,buflen);
>> *result = res ? NULL : pwptr;
>> return (res);
>> }
>>
>> Is this sufficient? copy_passwd is also in the bind library?
>
> There is a race between the getpwnam() call and when the data is
> copied to the user-supplied buffer. In addition to this, I don't
> think that getpwnam_r() is allowed to modify the static storage
> used by getpwnam(). The current passwd code is truly awful, and
> I think someone is working on a replacement for it. It might be
> worth waiting to see what happens there before investing too much
> energy in implementing the *_r() functions in the current code.
>
Yeah... I was just thinking... in order for the above to be re-entrant
the
actual implementation of getpwnam is going to have to be a lot cleaner
and with much less static state.
To replace the whole set of calls seems the correct way to do it now.
Someone did contact me a while back about working on this problem but
he doesn't appear to be subscribed to this list.
I remember asking this fellow to sync up with the other developers but
I don't
know that he ever did.
Dave
>
> Tim
More information about the freebsd-standards
mailing list