bin/52433: lines in /etc/group longer than 1024 chars are ignored

Jan Willem Knopper jwk at stack.nl
Mon May 19 08:20:12 PDT 2003


>Number:         52433
>Category:       bin
>Synopsis:       lines in /etc/group longer than 1024 chars are ignored
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon May 19 08:20:09 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator:     Jan Willem Knopper
>Release:        FreeBSD 5.1-BETA i386
>Organization:
M.C.G.V. Stack
>Environment:
System: FreeBSD turtle.stack.nl 5.1-BETA FreeBSD 5.1-BETA #10: Mon May 12 15:30:54 CEST 2003 jilles at turtle.stack.nl:/usr/obj/usr/src/sys/TURTLE i386

since the manpage of /etc/group mentioned something about compatibility and
long lines: (from before FreeBSD 3.0)

compatibility options in kernel config (as in GENERIC)

options         COMPAT_43               #Compatible with BSD 4.3 [KEEP THIS!]
options         COMPAT_FREEBSD4         #Compatible with FreeBSD4

>Description:
	getgrouplist only returns groups with lines larger than 1024 
	characters if getgrnam is previously called on that group in that
	process.

	This problem only occurs on FreeBSD 5 and not on FreeBSD 4.
>How-To-Repeat:
#include        <stdio.h>
#include        <grp.h>
#include        <unistd.h>

int
main(void)
{
	struct group *longgroup;
	int i, ngroups=16; /* NGROUPS_MAX is 16 */
	gid_t basegid=0, groups[16];

	if ((i=getgrouplist("user", basegid, groups, &ngroups))==-1) {
                perror("getgrouplist");
                return 1;
        }

        printf("ngroups:%d\n", ngroups);

        printf("%d", groups[1]);
        for (i=1;i<ngroups;i++) {
                printf(", %d", groups[i]);
        }
        printf("\n");
	
        longgroup=getgrnam("longgroup");
        if (!longgroup) {
                perror("getgrnam");
                return 1;
        }

	basegid=0; ngroups=16;
	if ((i=getgrouplist("user", basegid, groups, &ngroups))==-1) {
                perror("getgrouplist");
                return 1;
        }

        printf("ngroups:%d\n", ngroups);

        printf("%d", groups[1]);
        for (i=1;i<ngroups;i++) {
                printf(", %d", groups[i]);
        }
        printf("\n");
	
	return(0);
}
>Fix:
	None known.
>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list