]> granicus.if.org Git - sudo/commitdiff
Solaris maps negative gids to GID_NOBODY.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 24 Apr 2013 19:24:24 +0000 (15:24 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 24 Apr 2013 19:24:24 +0000 (15:24 -0400)
compat/getgrouplist.c

index a3eb87179f77d514876b267d92e3b1654ce550a3..c37ddb6e781ed4deef0b60c9a241b1c0fc5a0e33 100644 (file)
@@ -153,9 +153,18 @@ str2grp(const char *instr, int inlen, void *ent, char *buf, int buflen)
     gid = strtoul(cp, &ep, 10);
     if (*cp == '\0' || *ep != '\0')
        return yp ? NSS_STR_PARSE_SUCCESS : NSS_STR_PARSE_PARSE;
-    if (gid > GID_MAX || (gid == ULONG_MAX && errno == ERANGE))
+#ifdef GID_NOBODY
+    if (*cp == '-' && gid != 0) {
+       /* Negative gids get mapped to nobody on Solaris. */
+       grp->gr_gid = GID_NOBODY;
+    } else
+#endif
+    if ((errno == ERANGE && gid == ULONG_MAX) ||
+       gid > GID_MAX || gid != (gid_t)gid) {
        return NSS_STR_PARSE_ERANGE;
-    grp->gr_gid = (gid_t)gid;
+    } else {
+       grp->gr_gid = (gid_t)gid;
+    }
 
     /* Store group members, taking care to use proper alignment. */
     grp->gr_mem = NULL;