rehsack at googlemail.com
Fri Jul 16 06:39:34 UTC 2010
2010/7/16 Dan Nelson <dnelson at 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 = getpwent(); print Dumper(\@e); endpwent(); @e = getpwent(); print Dumper(\@e); endpwent(); @e = getpwent(); print Dumper(\@e); endpwent();'
>> >> $VAR1 = [ 'root', '', 0, 0, 0, '', 'Charlie &', '/root', '/bin/csh', 0 ];
>> >> $VAR1 = [ 'toor', '*', 0, 0, 0, '', 'Bourne-again Superuser', '/root', '', 0 ];
>> >> $VAR1 = [ 'daemon', '*', 1, 1, 0, '', 'Owner of many system processes', '/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 at waldorf.muppets.liwing.de:/usr/obj/usr/src/sys/WALDORF amd64
>> > The above output looks perfect, and should match the top three lines in
>> > /your etc/passwd files.
>> 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
>> 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 ...
> Try the following patch:
Can I do this without a full world rebuild? (I do not develop in FBSD actively).
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,
> Index: gen/getpwent.c
> --- gen/getpwent.c (revision 210157)
> +++ gen/getpwent.c (working copy)
> @@ -794,6 +794,7 @@ files_setpwent(void *retval, void *mdata, va_list
> st->db = NULL;
> + st->keynum = 0;
> Dan Nelson
> dnelson at allantgroup.com
More information about the freebsd-questions