]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
Handle GIDs > 2^31 in getgrouplist.
authorDarren Tucker <dtucker@dtucker.net>
Thu, 17 Jun 2021 11:03:19 +0000 (21:03 +1000)
committerDarren Tucker <dtucker@dtucker.net>
Thu, 17 Jun 2021 11:03:19 +0000 (21:03 +1000)
When compiled in 32bit mode, the getgrouplist implementation may fail
for GIDs greater than LONG_MAX.  Analysis and change from ralf.winkel
at tui.com.

openbsd-compat/port-aix.c

index e0d3eba51c55ad25610fde223d573a71318d81f8..2ac9bad09834e3812114ad0e4e04f9e7dfe2afd5 100644 (file)
@@ -445,7 +445,7 @@ getgrouplist(const char *user, gid_t pgid, gid_t *groups, int *grpcnt)
        char *cp, *grplist, *grp;
        gid_t gid;
        int ret = 0, ngroups = 0, maxgroups;
-       long l;
+       long long ll;
 
        maxgroups = *grpcnt;
 
@@ -463,12 +463,12 @@ getgrouplist(const char *user, gid_t pgid, gid_t *groups, int *grpcnt)
 
        /* copy each entry from getgrset into group list */
        while ((grp = strsep(&grplist, ",")) != NULL) {
-               l = strtol(grp, NULL, 10);
-               if (ngroups >= maxgroups || l == LONG_MIN || l == LONG_MAX) {
+               ll = strtoll(grp, NULL, 10);
+               if (ngroups >= maxgroups || ll < 0 || ll > UID_MAX) {
                        ret = -1;
                        goto out;
                }
-               gid = (gid_t)l;
+               gid = (gid_t)ll;
                if (gid == pgid)
                        continue;       /* we have already added primary gid */
                groups[ngroups++] = gid;