Index: trunk/src/sh_static.c
===================================================================
--- trunk/src/sh_static.c	(revision 427)
+++ trunk/src/sh_static.c	(revision 428)
@@ -76,5 +76,6 @@
 
 #define PWD_BUFFER_SIZE 256
-#define GRP_BUFFER_SIZE 256
+#define GRP_BUFFER_SIZE 3584
+#define GRP_BUFFER_SIZE_MALLOC 32768
 
 /**********************************************************************/
@@ -467,5 +468,6 @@
 	char **m;
 	struct group group;
-	char buff[PWD_BUFFER_SIZE];
+
+	char * buff = malloc(GRP_BUFFER_SIZE_MALLOC);
 
 	rv = -1;
@@ -481,5 +483,5 @@
 		num_groups = 1;
 
-		while (!__pgsreader(__parsegrent, &group, buff, sizeof(buff), grf)) {
+		while (!__pgsreader(__parsegrent, &group, buff, GRP_BUFFER_SIZE_MALLOC, grf)) {
 			assert(group.gr_mem); /* Must have at least a NULL terminator. */
 			if (group.gr_gid != gid) {
@@ -511,4 +513,5 @@
 	 * warnings from various malloc debuggers. */
 	free(group_list);
+	free(buff);
 	return rv;
 }
@@ -699,6 +702,10 @@
 				line_buff[line_len] = 0;
 			} else if (line_len + 2 == buflen) { /* line too long */
+			        rv = ERANGE;
+				break;
+				/*
 				++skip;
 				continue;
+				*/
 			}
 
Index: trunk/src/sh_unix.c
===================================================================
--- trunk/src/sh_unix.c	(revision 427)
+++ trunk/src/sh_unix.c	(revision 428)
@@ -1007,4 +1007,5 @@
   struct group *           w;
   gid_t                    gid  = 0;
+  int                      status = 0;
 
 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWNAM_R)
@@ -1035,10 +1036,27 @@
 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWNAM_R)
       buffer = SH_ALLOC(SH_GRBUF_SIZE);
-      sh_getgrnam_r(g, &grp, buffer, SH_GRBUF_SIZE, &w);
+      status = sh_getgrnam_r(g, &grp, buffer, SH_GRBUF_SIZE, &w);
 #else
+      errno = 0;
       w = sh_getgrnam(g);
-#endif
-
-      if (w == NULL)
+      status = errno;
+#endif
+
+      if ((status == ERANGE) && (w == NULL)) 
+	{
+	  static int seen = 0;
+	  
+	  if (seen == 0)
+	    {
+	      char errbuf[SH_ERRBUF_SIZE];
+
+	      sh_error_handle (SH_ERR_ERR, FIL__, __LINE__, EINVAL, MSG_E_GRNULL,
+			       sh_error_message(status, errbuf, sizeof(errbuf)),
+			       _("sh_group_to_gid"), (long) -1, _("line too long in group entry"));
+	      ++seen;
+	    }
+	  *fail = -1;
+	}
+      else if (w == NULL)
 	{
 	  char * tmp = sh_util_strdup(g);
@@ -2881,4 +2899,24 @@
 #endif
 
+  if (status == ERANGE) 
+    {
+      static int seen = 0;
+
+      if (seen == 0)
+	{
+	  sh_error_handle (SH_ERR_ERR, FIL__, __LINE__, EINVAL, MSG_E_GRNULL,
+			   sh_error_message(status, errbuf, sizeof(errbuf)),
+			   _("getgrgid"), (long) gid, _("line too long in group entry"));
+	  ++seen;
+	}
+      
+#if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRGID_R)
+      SH_FREE(buffer);
+#endif
+
+      sh_userid_add(gid, NULL, CACHE_GID);
+      SL_RETURN( NULL, _("sh_unix_getGIDname"));
+    }
+
   if (tempres == NULL) 
     {
Index: trunk/src/trustfile.c
===================================================================
--- trunk/src/trustfile.c	(revision 427)
+++ trunk/src/trustfile.c	(revision 428)
@@ -414,5 +414,5 @@
  */
 /* not static to circumvent stupid gcc 4 bug */ 
-int isingrp(gid_t grp, uid_t *ulist)
+int isingrp(gid_t grp, uid_t *ulist, int * errval)
 {
   struct passwd *w;	        /* info about group member */
@@ -420,4 +420,6 @@
   register char **p;		/* points to current group member */
   struct group *g;	        /* pointer to group information */
+
+  int status;
   
 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRGID_R)
@@ -430,13 +432,20 @@
   SL_ENTER(_("isingrp"));
 
+  *errval = 0;
+
 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRGID_R)
   buffer = malloc(SH_GRBUF_SIZE);
-  sh_getgrgid_r(grp, &gr, buffer, SH_GRBUF_SIZE, &g);
-#else
+  status = sh_getgrgid_r(grp, &gr, buffer, SH_GRBUF_SIZE, &g);
+#else
+  errno = 0;
   g = sh_getgrgid(grp);
+  status = errno;
 #endif
 
   if (g == NULL)
     {
+      if (status == ERANGE)
+	*errval = status;
+
       goto end_false;
     }
@@ -510,5 +519,5 @@
  */
 /* not static to circumvent stupid gcc 4 bug */ 
-int onlytrustedingrp(gid_t grp, uid_t *ulist)
+int onlytrustedingrp(gid_t grp, uid_t *ulist, int * errval)
 {
   struct passwd *w;	        /* info about group member */
@@ -518,4 +527,6 @@
   register int flag = -1;       /* group member found */
 
+  int status;
+
 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRGID_R)
   struct group    gr;
@@ -529,4 +540,6 @@
   SL_ENTER(_("onlytrustedingrp"));
 
+  *errval = 0;
+
 #ifdef TRUST_DEBUG
   fprintf(stderr, "trustfile: group writeable, group_gid: %ld\n", 
@@ -536,11 +549,16 @@
 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRGID_R)
   buffer = malloc(SH_GRBUF_SIZE);
-  sh_getgrgid_r(grp, &gr, buffer, SH_GRBUF_SIZE, &g);
-#else
+  status = sh_getgrgid_r(grp, &gr, buffer, SH_GRBUF_SIZE, &g);
+#else
+  errno = 0;
   g = sh_getgrgid(grp);
+  status = errno;
 #endif
 
   if (g == NULL)
     {
+      if (status == ERANGE)
+	*errval = status;
+
 #ifdef TRUST_DEBUG
       fprintf(stderr, 
@@ -722,4 +740,6 @@
   char c;			/* used to hold temp char          */
   
+  int errgrp = 0;
+
   SL_ENTER(_("sl_trustfile"));
   if (fname == NULL)
@@ -1010,6 +1030,6 @@
        */
       if (((stbuf.st_mode & S_IWGRP) == S_IWGRP) &&
-	  ((okusers != NULL && !onlytrustedingrp((gid_t)stbuf.st_gid,okusers))||
-	   (badusers != NULL && isingrp((gid_t)stbuf.st_gid, badusers)))
+	  ((okusers != NULL && !onlytrustedingrp((gid_t)stbuf.st_gid,okusers,&errgrp))||
+	   (badusers != NULL && isingrp((gid_t)stbuf.st_gid, badusers,&errgrp)))
 #ifdef STICKY
 	  && ((stbuf.st_mode&S_IFDIR) != S_IFDIR ||
@@ -1035,5 +1055,5 @@
 	  tf_badgid = (gid_t) stbuf.st_gid;
 	  free(fexp);
-	  SL_IRETURN(SL_EBADGID, _("sl_trustfile"));
+	  SL_IRETURN((errgrp == ERANGE) ? SL_ERANGE : SL_EBADGID, _("sl_trustfile"));
 	}
       /*
