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>