diff options
author | Steve Langasek <steve.langasek@canonical.com> | 2020-08-11 14:54:35 -0700 |
---|---|---|
committer | Steve Langasek <steve.langasek@canonical.com> | 2020-08-11 15:00:33 -0700 |
commit | 239d9c3181694bda5a0531ac579612c46c3b4e6d (patch) | |
tree | 43c04725cde922627215f4c32665ea832dd456d1 /libpam/pam_modutil_ingroup.c | |
parent | aa2142277bf5fb4a884c6119180e41258817705b (diff) | |
parent | f6d08ed47a3da3c08345bce2ca366e961c52ad7c (diff) | |
download | pam-239d9c3181694bda5a0531ac579612c46c3b4e6d.tar.gz pam-239d9c3181694bda5a0531ac579612c46c3b4e6d.tar.bz2 pam-239d9c3181694bda5a0531ac579612c46c3b4e6d.zip |
Merge upstream version 1.4.0
Diffstat (limited to 'libpam/pam_modutil_ingroup.c')
-rw-r--r-- | libpam/pam_modutil_ingroup.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/libpam/pam_modutil_ingroup.c b/libpam/pam_modutil_ingroup.c index 875cf3e2..356302ee 100644 --- a/libpam/pam_modutil_ingroup.c +++ b/libpam/pam_modutil_ingroup.c @@ -12,31 +12,34 @@ #include <grp.h> #ifdef HAVE_GETGROUPLIST + +#define NGROUPS_MIN 100 +#define NGROUPS_MAX 65536 + static int checkgrouplist(const char *user, gid_t primary, gid_t target) { - gid_t *grouplist = NULL; - int agroups, ngroups, i; - ngroups = agroups = 3; + int ngroups, pgroups, i; + + ngroups = NGROUPS_MIN; do { - grouplist = malloc(sizeof(gid_t) * agroups); + gid_t *grouplist; + + pgroups = ngroups; + grouplist = malloc(sizeof(gid_t) * ngroups); if (grouplist == NULL) { return 0; } - ngroups = agroups; i = getgrouplist(user, primary, grouplist, &ngroups); - if ((i < 0) || (ngroups < 1)) { - agroups *= 2; - free(grouplist); - } else { + if (i >= 0) { for (i = 0; i < ngroups; i++) { if (grouplist[i] == target) { free(grouplist); return 1; } } - free(grouplist); } - } while (((i < 0) || (ngroups < 1)) && (agroups < 10000)); + free(grouplist); + } while (i < 0 && ngroups > 0 && ngroups != pgroups && ngroups <= NGROUPS_MAX); return 0; } #endif |