summaryrefslogtreecommitdiff
path: root/usr.bin/newgrp
diff options
context:
space:
mode:
authorBrooks Davis <brooks@FreeBSD.org>2009-06-19 15:58:24 +0000
committerBrooks Davis <brooks@FreeBSD.org>2009-06-19 15:58:24 +0000
commit54404cfb13d40e474f72d3c75de1f4db3417df64 (patch)
treeb7d4401847de9bebf98c6fe35d5b61bfd749c7dc /usr.bin/newgrp
parent68cc62cec1384a3e08391dc734b0ff16f6eda869 (diff)
downloadsrc-test2-54404cfb13d40e474f72d3c75de1f4db3417df64.tar.gz
src-test2-54404cfb13d40e474f72d3c75de1f4db3417df64.zip
Notes
Diffstat (limited to 'usr.bin/newgrp')
-rw-r--r--usr.bin/newgrp/newgrp.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/usr.bin/newgrp/newgrp.c b/usr.bin/newgrp/newgrp.c
index 62d552fa05d3..91b62a52779d 100644
--- a/usr.bin/newgrp/newgrp.c
+++ b/usr.bin/newgrp/newgrp.c
@@ -146,8 +146,8 @@ restoregrps(void)
static void
addgroup(const char *grpname)
{
- gid_t grps[NGROUPS_MAX];
- long lgid;
+ gid_t *grps;
+ long lgid, ngrps_max;
int dbmember, i, ngrps;
gid_t egid;
struct group *grp;
@@ -185,7 +185,10 @@ addgroup(const char *grpname)
}
}
- if ((ngrps = getgroups(NGROUPS_MAX, (gid_t *)grps)) < 0) {
+ ngrps_max = sysconf(_SC_NGROUPS_MAX) + 1;
+ if ((grps = malloc(sizeof(gid_t) * ngrps_max)) == NULL)
+ err(1, "malloc");
+ if ((ngrps = getgroups(ngrps_max, (gid_t *)grps)) < 0) {
warn("getgroups");
return;
}
@@ -217,7 +220,7 @@ addgroup(const char *grpname)
/* Add old effective gid to supp. list if it does not exist. */
if (egid != grp->gr_gid && !inarray(egid, grps, ngrps)) {
- if (ngrps == NGROUPS_MAX)
+ if (ngrps == ngrps_max)
warnx("too many groups");
else {
grps[ngrps++] = egid;
@@ -231,6 +234,7 @@ addgroup(const char *grpname)
}
}
+ free(grps);
}
static int