about summary refs log tree commit diff
path: root/hesiod/nss_hesiod/hesiod-grp.c
diff options
context:
space:
mode:
Diffstat (limited to 'hesiod/nss_hesiod/hesiod-grp.c')
-rw-r--r--hesiod/nss_hesiod/hesiod-grp.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/hesiod/nss_hesiod/hesiod-grp.c b/hesiod/nss_hesiod/hesiod-grp.c
index c0b56ac214..a973fab80f 100644
--- a/hesiod/nss_hesiod/hesiod-grp.c
+++ b/hesiod/nss_hesiod/hesiod-grp.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1997.
 
@@ -188,14 +188,19 @@ internal_gid_from_group (void *context, const char *groupname, gid_t *group)
 	{
 	  char *endp;
 	  char *q = ++p;
+	  long int val;
 
 	  q = p;
 	  while (*q != '\0' && *q != ':')
 	    ++q;
 
-	  *group = strtol (p, &endp, 10);
-	  if (endp == q && endp != p)
-	    status = NSS_STATUS_SUCCESS;
+	  val = strtol (p, &endp, 10);
+	  if (sizeof (gid_t) == sizeof (long int) || (gid_t) val == val)
+	    {
+	      *group = val;
+	      if (endp == q && endp != p)
+		status = NSS_STATUS_SUCCESS;
+	    }
         }
       hesiod_free_list (context, grp_res);
     }
@@ -219,7 +224,7 @@ _nss_hesiod_initgroups (const char *user, gid_t group, long int *start,
 
   if (list == NULL)
     {
-      hesiod_end(context);
+      hesiod_end (context);
       return errno == ENOENT ? NSS_STATUS_NOTFOUND : NSS_STATUS_UNAVAIL;
     }
 
@@ -231,6 +236,7 @@ _nss_hesiod_initgroups (const char *user, gid_t group, long int *start,
     {
       char *endp;
       char *q;
+      long int val;
 
       status = NSS_STATUS_NOTFOUND;
 
@@ -241,21 +247,24 @@ _nss_hesiod_initgroups (const char *user, gid_t group, long int *start,
       if (*q != '\0')
 	*q++ = '\0';
 
-      group = strtol (p, &endp, 10);
-      if (*endp == '\0' && endp != p)
-	status = NSS_STATUS_SUCCESS;
-      else
-	status = internal_gid_from_group (context, p, &group);
+      val = strtol (p, &endp, 10);
+      if (sizeof (gid_t) == sizeof (long int) || (gid_t) val == val)
+	{
+	  if (*endp == '\0' && endp != p)
+	    status = NSS_STATUS_SUCCESS;
+	  else
+	    status = internal_gid_from_group (context, p, &group);
 
-      if (status == NSS_STATUS_SUCCESS
-	  && !internal_gid_in_list (groups, group, *start))
-	groups[(*start)++] = group;
+	  if (status == NSS_STATUS_SUCCESS
+	      && !internal_gid_in_list (groups, group, *start))
+	    groups[(*start)++] = group;
+	}
 
       p = q;
     }
 
   hesiod_free_list (context, list);
-  hesiod_end(context);
+  hesiod_end (context);
 
   return NSS_STATUS_SUCCESS;
 }