Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Jul 2010 08:39:31 +0200
From:      Jens Rehsack <rehsack@googlemail.com>
To:        Dan Nelson <dnelson@allantgroup.com>
Cc:        Ashish SHUKLA <ashish@freebsd.org>, freebsd-questions@freebsd.org
Subject:   Re: getpwent bug?
Message-ID:  <AANLkTilSum3vumQhv4qtOQhCaSHo832Ub3b9bEhP0zSt@mail.gmail.com>
In-Reply-To: <20100716043056.GF5485@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>

next in thread | previous in thread | raw e-mail | index | archive | help
2010/7/16 Dan Nelson <dnelson@allantgroup.com>:
> In the last episode (Jul 16), Ashish SHUKLA said:
>> Dan Nelson writes:
>> > In the last episode (Jul 15), Jens Rehsack said:
>> >> Hi all,
>> >>
>> >> I detected an issue with getpwent on my FreeBSD test box:
>> >>
>> >> perl -MData::Dumper -e 'my @e =3D getpwent(); print Dumper(\@e); endp=
went(); @e =3D getpwent(); print Dumper(\@e); endpwent(); @e =3D getpwent()=
; print Dumper(\@e); endpwent();'
>> >> $VAR1 =3D [ 'root', '', 0, 0, 0, '', 'Charlie &', '/root', '/bin/csh'=
, 0 ];
>> >> $VAR1 =3D [ 'toor', '*', 0, 0, 0, '', 'Bourne-again Superuser', '/roo=
t', '', 0 ];
>> >> $VAR1 =3D [ 'daemon', '*', 1, 1, 0, '', 'Owner of many system process=
es', '/root', '/usr/sbin/nologin', 0 ];
>> >>
>> >> I'm using FreeBSD waldorf.muppets.liwing.de 7.3-PRERELEASE FreeBSD 7.=
3-PRERELEASE #0: Fri Mar 12 11:31:18 UTC 2010 root@waldorf.muppets.liwing.d=
e:/usr/obj/usr/src/sys/WALDORF =A0amd64
>>
>> > The above output looks perfect, and should match the top three lines i=
n
>> > /your etc/passwd files.
>>
>> Well, OP is also invoking 'endpwent()' after every 'getpwent()' invocati=
on
>> 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 se=
ems
another bug ...

> Try the following patch:

Can I do this without a full world rebuild? (I do not develop in FBSD activ=
ely).
Otherwise I recommend (the test case was in OP) that someone with a
separate test box tries it out and commit it etc.

I had to develop a workaround for all other boxes anyway.

Thank you very much,
Jens

> Index: gen/getpwent.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- gen/getpwent.c =A0 =A0 =A0(revision 210157)
> +++ gen/getpwent.c =A0 =A0 =A0(working copy)
> @@ -794,6 +794,7 @@ files_setpwent(void *retval, void *mdata, va_list
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0(void)st->db->close(st->db=
);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0st->db =3D NULL;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0}
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 st->keynum =3D 0;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0break;
> =A0 =A0 =A0 =A0default:
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0break;
>
>
> --
> =A0 =A0 =A0 =A0Dan Nelson
> =A0 =A0 =A0 =A0dnelson@allantgroup.com
>



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