From owner-freebsd-questions@FreeBSD.ORG Fri Jul 16 04:30:58 2010 Return-Path: Delivered-To: freebsd-questions@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 62A4E1065678 for ; Fri, 16 Jul 2010 04:30:58 +0000 (UTC) (envelope-from dan@dan.emsphone.com) Received: from email1.allantgroup.com (email1.emsphone.com [199.67.51.115]) by mx1.freebsd.org (Postfix) with ESMTP id 2C1E98FC08 for ; Fri, 16 Jul 2010 04:30:57 +0000 (UTC) Received: from dan.emsphone.com (dan.emsphone.com [199.67.51.101]) by email1.allantgroup.com (8.14.0/8.14.0) with ESMTP id o6G4Uvk0072540 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 15 Jul 2010 23:30:57 -0500 (CDT) (envelope-from dan@dan.emsphone.com) Received: from dan.emsphone.com (smmsp@localhost [127.0.0.1]) by dan.emsphone.com (8.14.4/8.14.4) with ESMTP id o6G4UvVW022447 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 15 Jul 2010 23:30:57 -0500 (CDT) (envelope-from dan@dan.emsphone.com) Received: (from dan@localhost) by dan.emsphone.com (8.14.4/8.14.3/Submit) id o6G4UuGn022443; Thu, 15 Jul 2010 23:30:56 -0500 (CDT) (envelope-from dan) Date: Thu, 15 Jul 2010 23:30:56 -0500 From: Dan Nelson To: Ashish SHUKLA Message-ID: <20100716043056.GF5485@dan.emsphone.com> References: <20100715172615.GC5485@dan.emsphone.com> <86tyo0qd19.fsf@chateau.d.if> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <86tyo0qd19.fsf@chateau.d.if> X-OS: FreeBSD 8.1-PRERELEASE User-Agent: Mutt/1.5.20 (2009-06-14) X-Virus-Scanned: clamav-milter 0.96 at email1.allantgroup.com X-Virus-Status: Clean X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-2.0.2 (email1.allantgroup.com [199.67.51.78]); Thu, 15 Jul 2010 23:30:57 -0500 (CDT) X-Scanned-By: MIMEDefang 2.45 Cc: Jens Rehsack , freebsd-questions@FreeBSD.org Subject: Re: getpwent bug? X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Jul 2010 04:30:58 -0000 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@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. > 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. Try the following patch: 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 (void)st->db->close(st->db); st->db = NULL; } + st->keynum = 0; break; default: break; -- Dan Nelson dnelson@allantgroup.com