aboutsummaryrefslogtreecommitdiff
path: root/libpam/pam_modutil_ingroup.c
diff options
context:
space:
mode:
authorSteve Langasek <steve.langasek@canonical.com>2020-08-11 14:54:35 -0700
committerSteve Langasek <steve.langasek@canonical.com>2020-08-11 15:00:33 -0700
commit239d9c3181694bda5a0531ac579612c46c3b4e6d (patch)
tree43c04725cde922627215f4c32665ea832dd456d1 /libpam/pam_modutil_ingroup.c
parentaa2142277bf5fb4a884c6119180e41258817705b (diff)
parentf6d08ed47a3da3c08345bce2ca366e961c52ad7c (diff)
downloadpam-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.c25
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