getpwent bug?

Ashish SHUKLA ashish at FreeBSD.org
Fri Jul 16 04:14:03 UTC 2010


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.

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.

#v+
#include <pwd.h>
#include <stdio.h>

int
main()
{
	struct passwd* pw;
	int i;
	char ch;

	for(i = 0; i < 3; i++)
	{
		printf("Doing getpwent(). Press any key to continue...");
		while(getchar() != '\n');
		pw = getpwent();
		printf("%s:%d:%d\n", pw->pw_name, pw->pw_uid, pw->pw_gid);
		endpwent();
	}
}
#v-

Output on FreeBSD 8.1-RC2:

#v+
%./pwent 
Doing getpwent(). Press any key to continue...
root:0:0
Doing getpwent(). Press any key to continue...
toor:0:0
Doing getpwent(). Press any key to continue...
daemon:1:1
#v-

Output on GNU/Linux:

#v+
% ./pwent
Doing getpwent(). Press any key to continue...
root:0:0
Doing getpwent(). Press any key to continue...
root:0:0
Doing getpwent(). Press any key to continue...
root:0:0
#v-

HTH
-- 
Ashish SHUKLA      | GPG: F682 CDCC 39DC 0FEA E116  20B6 C746 CFA9 E74F A4B0
freebsd.org!ashish | http://people.freebsd.org/~ashish/

“How can I possibly put a new idea into your heads, if I do not first
remove your delusions?” (Robert A. Heinlein, "Life-Line", 1939)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 835 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-questions/attachments/20100716/f67027a6/attachment.pgp


More information about the freebsd-questions mailing list