Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Jul 2010 16:22:28 +0000
From:      Jens Rehsack <rehsack@googlemail.com>
To:        Dan Nelson 0 <dnelson@allantgroup.com>
Cc:        Ashish SHUKLA <ashish@freebsd.org>, freebsd-questions@freebsd.org
Subject:   Re: getpwent bug?
Message-ID:  <4C408744.3030409@netbsd.org>
In-Reply-To: <20100716150719.GG5485@dan.emsphone.com>
References:  <AANLkTin5RGYfu_Xt5HWxKFO8GMTOi3YWQ8dyr95ZDW-Y@mail.gmail.com> <20100715172615.GC5485@dan.emsphone.com> <86tyo0qd19.fsf@chateau.d.if> <20100716043056.GF5485@dan.emsphone.com> <AANLkTilSum3vumQhv4qtOQhCaSHo832Ub3b9bEhP0zSt@mail.gmail.com> <20100716150719.GG5485@dan.emsphone.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 07/16/10 15:07, Dan Nelson wrote:
> In the last episode (Jul 16), Jens Rehsack said:
>> 2010/7/16 Dan Nelson<dnelson@allantgroup.com>:
>>> In the last episode (Jul 16), Ashish SHUKLA said:
>>>> Well, OP is also invoking 'endpwent()' after every 'getpwent()'
>>>> invocation which according to GNU/Linux's glibc and NetBSD's libc (as
>>>> OP mentioned) should rewind the position in passwd database to the
>>>> beginning.
>>>
>>> Ah. I missed the endpwent calls.
>>
>> Was difficult for me to format the single liner ;)
>>
>>>> To me it definitely looks like a bug in FreeBSD's getpw*() family of
>>>> functions.
>>>>
>>>> As tested using sysutils/lsof, in the following program in FreeBSD, the
>>>> descriptor corresponding to '/etc/pwd.db' is closed on endpwent(3) but
>>>> position in database is never rewinded as shown in the output.
>>>
>>> It looks like the *pwent functions keep an internal counter that
>>> endpwent doesn't reset.
>>
>> Could you please take a look to my other mail (getgrent related) - there
>> seems another bug ...
>
> Do you have another one-liner that will reproduce it?  A simple
> "/usr/bin/getent group" doesn't return dupes for me.  Oddly enough, the
> *grent code doesn't use an internal counter, so the bug you found in
> endpwent doesn't exist in endgrent (afaik; the nsswitch code isn't that easy
> to read).

Not really a one-liner:
perl -MData::Dumper -e 'setgrent; my %dupchk; while( my ( $name, $grpass, 
$gid, $members ) = getgrent() ) { print "$name is returned more than once 
(No $dupchk{$name} comes here)\n" if( $dupchk{$name}++ ); print Dumper( [ 
$name, $grpass, $gid, $members ] ) };'

setgrent() doesn't work here.

Best regards,
Jens



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4C408744.3030409>