Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 29 May 2006 22:16:07 GMT
From:      "Philip M. Gollucci" <pgollucci@p6m7g8.com>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   misc/98111: /etc/groups the parser dies on large groups
Message-ID:  <200605292216.k4TMG77F054981@www.freebsd.org>
Resent-Message-ID: <200605292220.k4TMKG0K085819@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         98111
>Category:       misc
>Synopsis:       /etc/groups the parser dies on large groups
>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 29 22:20:16 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator:     Philip M. Gollucci
>Release:        6.1-RELEASE
>Organization:
P6M7G8 Consulting
>Environment:
FreeBSD minotaur.apache.org 6.1-RELEASE FreeBSD 6.1-RELEASE #0: Thu May 11 11:50:25 PDT 2006     root@minotaur.apache.org:/usr/obj/usr/src/sys/SMP-turbo  i38
>Description:
in /etc/groups ... the Apache Software Foundation(ASF) has some large groups
where the parser just craps out.  They been successfully using the below patch for at least 1.5 years in 5.3-R,5.4-R, and 6.1-R.

This patch was written by Justin Erenkrantz <justin@erenkrantz.com>.


>How-To-Repeat:
cat /etc/groups 
g:*:1010:a,b,c,d,e,f,g,h,i,j,k,l.m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,bb,cc,dd,ee,ff,g
g,hh,ii,jj,kk,ll,mm,nn,oo,pp,qq,rr,ss,tt,uu,vv,ww,xx,yy,zz,aaa,bbb,ccc,ddd,eee,f
ff,ggg,hhh,iii,jjj,kkk,lll,mmm,nnn,ooo,ppp,qqq,rrr,sss,ttt,uuu,vvv,www,xxx,yyy,z
zz,aaaa,bbbb,cccc,dddd,eeee,ffff,gggg,hhhh,iiii,jjjj,kkkk,llll,mmmm,nnnn,oooo,pp
pp,qqqq,rrrr,ssss,tttt,uuuu,vvvv,wwww,xxxx,yyyy,zzzz,aaaaa,bbbbb,ccccc,ddddd,eee
ee,fffff,ggggg,hhhhh,iiiii,jjjjj,kkkkk,iiiii,lllll,mmmmm,nnnnn,ooooo,ppppp,qqqqq
,rrrrr,sssss,ttttt,uuuuu,vvvvv,wwwww,xxxxx,yyyyy,zzzzz,pgollucci

id pgollucci
uid=1001(pgollucci) gid=0(wheel) groups=0(wheel)

should have said
uid=1001(pgollucci) gid=0(wheel) groups=0(wheel), 1010(g)

pgollucci:*:1001:0::0:0:Philip M. Gollucci:/home/pgollucci:/bin/tcsh
>Fix:
--- lib/libc/gen/getgrent.c.bak  Tue Jun 28 09:34:10 2005
+++ lib/libc/gen/getgrent.c  Tue Jun 28 10:21:08 2005
@@ -446,6 +446,7 @@
  char      *buffer;
  size_t       bufsize, linesize;
  int      rv, stayopen, *errnop;
+    fpos_t           pos;

  name = NULL;
  gid = (gid_t)-1;
@@ -481,6 +482,7 @@
    stayopen = st->stayopen;
  }
  rv = NS_NOTFOUND;
+    fgetpos(st->fp, &pos);
  while ((line = fgetln(st->fp, &linesize)) != NULL) {
    if (line[linesize-1] == '\n')
      linesize--;
@@ -502,11 +504,15 @@
        &buffer[linesize + 1], bufsize - linesize - 1, errnop);
    if (rv & NS_TERMINATE)
      break;
+        fgetpos(st->fp, &pos);
  }
  if (!stayopen && st->fp != NULL) {
    fclose(st->fp);
    st->fp = NULL;
  }
+    if (st->fp != NULL && rv == NS_RETURN && *errnop == ERANGE) {
+        fsetpos(st->fp, &pos);
+    }
  if (rv == NS_SUCCESS && retval != NULL)
    *(struct group **)retval = grp;
  return (rv);

>Release-Note:
>Audit-Trail:
>Unformatted:



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