summaryrefslogtreecommitdiffstats
path: root/usr.bin/id
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/id')
-rw-r--r--usr.bin/id/id.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/usr.bin/id/id.c b/usr.bin/id/id.c
index d18e8b0..1929d96 100644
--- a/usr.bin/id/id.c
+++ b/usr.bin/id/id.c
@@ -258,7 +258,8 @@ id_print(struct passwd *pw, int use_ggl, int p_euid, int p_egid)
gid_t gid, egid, lastgid;
uid_t uid, euid;
int cnt, ngroups;
- gid_t groups[NGROUPS + 1];
+ long ngroups_max;
+ gid_t *groups;
const char *fmt;
if (pw != NULL) {
@@ -270,12 +271,16 @@ id_print(struct passwd *pw, int use_ggl, int p_euid, int p_egid)
gid = getgid();
}
+ ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
+ if ((groups = malloc(sizeof(gid_t) * ngroups_max)) == NULL)
+ err(1, "malloc");
+
if (use_ggl && pw != NULL) {
- ngroups = NGROUPS + 1;
+ ngroups = ngroups_max;
getgrouplist(pw->pw_name, gid, groups, &ngroups);
}
else {
- ngroups = getgroups(NGROUPS + 1, groups);
+ ngroups = getgroups(ngroups_max, groups);
}
if (pw != NULL)
@@ -306,6 +311,7 @@ id_print(struct passwd *pw, int use_ggl, int p_euid, int p_egid)
lastgid = gid;
}
printf("\n");
+ free(groups);
}
#ifdef USE_BSM_AUDIT
@@ -361,15 +367,19 @@ group(struct passwd *pw, int nflag)
{
struct group *gr;
int cnt, id, lastid, ngroups;
- gid_t groups[NGROUPS + 1];
+ long ngroups_max;
+ gid_t *groups;
const char *fmt;
+ ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
+ if ((groups = malloc(sizeof(gid_t) * (ngroups_max))) == NULL)
+ err(1, "malloc");
+
if (pw) {
- ngroups = NGROUPS + 1;
+ ngroups = ngroups_max;
(void) getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups);
} else {
- groups[0] = getgid();
- ngroups = getgroups(NGROUPS, groups + 1) + 1;
+ ngroups = getgroups(ngroups_max, groups);
}
fmt = nflag ? "%s" : "%u";
for (lastid = -1, cnt = 0; cnt < ngroups; ++cnt) {
@@ -389,6 +399,7 @@ group(struct passwd *pw, int nflag)
lastid = id;
}
(void)printf("\n");
+ free(groups);
}
void
OpenPOWER on IntegriCloud